![]() |
SynEdit: Alle Highlighter ändern
Hi,
ich habe mehrere verschiedene SynEdit-Highlighter auf einem Formular. Es gibt ein Optionsmenü, das die Farb- und Schriftstilinformationen aller Highlighter auf einmal ändern soll. Man wählt dann über eine ComboBox aus, welche Farben und Schriftstile man bearbeiten möchte (Assembler, Kommentar, Schlüsselwert, ...). Da dieses Optionsmenü einen OK-Button besitzt, sollen erst beim Klick auf den OK-Button alle Highlighter geändert werden. Daher müsste man die Werte alle zwischenspeichern und am Ende möglichst einfach auf die einzelnen Highlighter zuweisen. Jeder SynEdit-Highlighter ist von TSynCustomHighlighter abgeleitet. Allerdings besitzt TSynCustomHighlighter überhaupt keine Werte wie sie in den Highlightern selbst auftauchen. Nun müsste man beim Klick auf OK das Formular mit den Highlightern durchlaufen und alle Farben ändern. Das Durchlaufen ist noch einfach: Man prüft, ob die Komponente ein TSynCustomHighlighter ist. Aber nun stellt sich die Frage: Wie bekommt man die zwischengespeicherten Daten vom Optionsmenü in alle Highlighter rein? Zum Beisipel TSynCSSSyn ist nicht vergleichbar mit TSynPasSyn. Ein Cast ist daher nicht möglich. Wie würdet ihr das lösen ? Was noch viel besser wäre: Man könnte jeden Highlighter einzeln setzen. Denn ich habe gerade festgestellt, dass die Highlighter sich teilweise so unterscheiden, dass die ComboBox alles andere als schön wäre und es übersichtlicher wäre, alle einzeln zu setzen. Wie könnte man das geschickt lösen ? |
Re: SynEdit: Alle Highlighter ändern
Optionsdialog mit TPageControl (Jeder Tab ein Highlighter). auf dem so eine Vorschau ist und der dazugehörige Highlighter. Während dem Dialog wird nur dieser Highlighter geändert und bei Klick auf OK werden die Eigenschaften auf den im Hauptprogramm verwendeten übertragen.
|
Re: SynEdit: Alle Highlighter ändern
Halte ich für schlecht. Entweder knallt man sich den Speicher und das Formular mit unendlich vielen Komponenten zu ODER man erzeugt alles dynamisch und der Speicher wird unnötig dicht gemacht.
|
Re: SynEdit: Alle Highlighter ändern
Aber der aufwand mit speichern ist nicht gegeben und sonst müsstest du ja auch die ganzen einstellungen irgendwo speichern....
|
Re: SynEdit: Alle Highlighter ändern
Zitat:
bin aber noch nicht so weit. Über RTTI .. die Quelltexte wollte ich noch aktualisieren, ..... müsste man aber noch den Klassencheck ausbauen, funktioniert im Moment nur, wenn es der gleiche Typ ist. solange ich das noch nciht habe, müsstest Du die Komponente mal selbst umändern :-)
Delphi-Quellcode:
function CopyPupProperties(const aSource, aDestination : TObject) : boolean;
const cTempName = 'Temp'; var XMLSerializer : TXMLSerializer; begin result := false; XMLSerializer := TXMLSerializer.Create(nil); try DefaultSettings(XMLSerializer); if (aSource is TComponent) and (aDestination is TComponent) then begin result := XMLSerializer.SaveComponent(TComponent(aSource), cTempName ) <> nil; if result then result := ( XMLSerializer.LoadComponent(TComponent(aDestination), cTempName ) <> nil); end else begin result := XMLSerializer.SaveObject(aSource, cTempName) <> nil; if result then result := XMLSerializer.LoadObject(aDestination,cTempName) <> nil; end; finally XMLSerializer.Free; end; end; siehe da .. ![]() deswegen wundert es mich ja, dass die RTTI funktionen auf so wenig begeisterung stoßen :-) |
Re: SynEdit: Alle Highlighter ändern
Zitat:
TMS hat ebenfalls einen (optisch schöneren) RTTI Inspector .. ![]() speichern dann einfach mit dem XML Serialisierer :-) ingesamt 2-3 Befehle :-) |
Re: SynEdit: Alle Highlighter ändern
Ne, ich nutze Lazarus. Da gibt es auch einen ObjektInspektor. Dem Teil kann man Objekte aller Art zuweisen und er zeigt alles an, kann alles ändern usw. Aber das sieht so stillos aus. Denn er verdeckt die Typen nicht. Da steht also am Ende:
AsmAttri (TSynHighlighterAttributes) Alles andere als schön. |
Re: SynEdit: Alle Highlighter ändern
Ich würde das vielleicht über eine Klasse machen. Beispiel :
Delphi-Quellcode:
Wie gesagt, ist nur ein Beispiel. Natürlich kann man es auch noch weiter aufdröseln in den Properties.
THighlighterProp = class
private FASMFontStyle : TFont; FASMColor : TColor; {u.s.w.} procedure ReadProp; procedure WriteProp; public property ASMFontStyle : TFont read FASMFontStyle write FASMFontStyle; end; |
Re: SynEdit: Alle Highlighter ändern
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe mal eine Unit aus einem Projekt von mir angehängt (auch Lazarus), bei dem diese Farben einzeln setzbar sind.
Dabei habe ich das so gelöst, dass die ExportToFile-Funktion der Highlighter offenbar als einfache Ini-Datei erzeugt, die nach dem Muster
Code:
aufgebaut ist (nur ein beispiel hier)
[Assembler]
Background=536870911 Foreground=536870911 Style=0 StyleMask=0 Das lässt sich natürlich leicht parsen, speichern und wieder importieren. Das Beispiel nutzt hier nur den jeweils gerade aktiven Highlighter, sollte sich aber durch entsprechende Verwaltungslisten auch auf alle übertragen lassen (wird hier auch in der Hauptunit getan) Es wird die entsprechende, vorher exportierte Ini gelesen, Colorbuttons erstellt, Checkboxen für Styles erstellt, und bei Klick auf OK wieder in die ini geschrieben. Der Aufruf von SetLanguage importiert die Styles dann wieder in den aktiven Highlighter. Solltest du Teile daraus verwenden, bitte der fairness halber meinen Namen nennen. Danke. Wie sich die Stylemasken aufbauen sollte ersichtlich sein, leider ist der Code schlecht kommentiert. |
Re: SynEdit: Alle Highlighter ändern
Was mir gerade aufgefallen ist
Delphi-Quellcode:
Bei ComponentCount = 0 wird Components[0] angesprochen (das es nicht gibt)
for i := ComponentCount-1 downto 0 do
Vieleicht ein Denkfehler von mir? Mache es aber so:
Delphi-Quellcode:
Bei ComponentCount = 0 wird die Schleife nicht ausgeführt.
for i := ComponentCount downto 1 do
Components[i-1]... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz