Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi SynEdit: Alle Highlighter ändern (https://www.delphipraxis.net/129354-synedit-alle-highlighter-aendern.html)

Nils_13 17. Feb 2009 19:24


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 ?

Florian Hämmerle 17. Feb 2009 19:34

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.

Nils_13 17. Feb 2009 19:50

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.

Florian Hämmerle 17. Feb 2009 19:51

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....

stoxx 17. Feb 2009 20:07

Re: SynEdit: Alle Highlighter ändern
 
Zitat:

Aber nun stellt sich die Frage: Wie bekommt man die zwischengespeicherten Daten vom Optionsmenü in alle Highlighter rein?
also ich wüsste ja, wie ich es machen würde :-)
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 ..

http://www.delphipraxis.net/internal...+serialisierer


deswegen wundert es mich ja, dass die RTTI funktionen auf so wenig begeisterung stoßen :-)

stoxx 17. Feb 2009 20:23

Re: SynEdit: Alle Highlighter ändern
 
Zitat:

Was noch viel besser wäre: Man könnte jeden Highlighter einzeln setzen.
dann hole Dir den TJVInspector von Jedi und hänge den entsprechenden Highlighter drauf, und schwupp die wupp kannst Du ihn genauso bearbeiten, wie unter der IDE selber ....

TMS hat ebenfalls einen (optisch schöneren) RTTI Inspector ..

http://www.tmssoftware.com/site/inspbars.asp


speichern dann einfach mit dem XML Serialisierer :-)

ingesamt 2-3 Befehle :-)

Nils_13 17. Feb 2009 20:31

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.

RWarnecke 17. Feb 2009 22:05

Re: SynEdit: Alle Highlighter ändern
 
Ich würde das vielleicht über eine Klasse machen. Beispiel :
Delphi-Quellcode:
THighlighterProp = class
private
  FASMFontStyle : TFont;
  FASMColor    : TColor;

{u.s.w.}
 
  procedure ReadProp;
  procedure WriteProp;
public
  property ASMFontStyle : TFont read FASMFontStyle write FASMFontStyle;
end;
Wie gesagt, ist nur ein Beispiel. Natürlich kann man es auch noch weiter aufdröseln in den Properties.

inherited 17. Feb 2009 23:55

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:
[Assembler]
Background=536870911
Foreground=536870911
Style=0
StyleMask=0
aufgebaut ist (nur ein beispiel hier)
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.

Satty67 18. Feb 2009 00:03

Re: SynEdit: Alle Highlighter ändern
 
Was mir gerade aufgefallen ist
Delphi-Quellcode:
for i := ComponentCount-1 downto 0 do
Bei ComponentCount = 0 wird Components[0] angesprochen (das es nicht gibt)

Vieleicht ein Denkfehler von mir? Mache es aber so:
Delphi-Quellcode:
for i := ComponentCount downto 1 do
  Components[i-1]...
Bei ComponentCount = 0 wird die Schleife nicht ausgeführt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:22 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz