| Autor |
Beitrag |
anubis1368
Hält's aus hier
Beiträge: 3
|
Verfasst: Mo 21.11.11 18:08
Ich verzweifel seit Tagen an einem Projekt, für das ich Highlighting benötige. Ich hab Google rauf und runter gesucht, aber nichts ist brauchbar. Es geht bei mir nicht darum bestimmte Worte hervorzuheben, sondern alles innerhalb von 2 Klammern. Theoretisch geht das ja über die Comment Funktionen, aber die sind auch nutzlos für mich, da ich verschachtelte Hervorhebungen brauch.
(rot rot rot (blau blau blau (grün grün grün) blau blau) rot rot)
Ich hab es mit SelText, SelLenggth und Co probiert. Das geht zwar, aber man kann zusehen, wie jeder Buchstabe einzeln in das RichEdit geschrieben wird. Grottenlahm, daher unbrauchbar.
Danach habe ich eine Routine gefunden, die über Windows API direkt die Buchstaben färbt. Das geht zwar flott und funktioniert genau so wie es soll, aber alle Buchstaben werden fetter und sobald man das RichEdit scrollt, sieht man, das die Buchstaben leicht versetzt übereinander liegen. Sieht grausig aus, also auch unbrauchbar.
Wenn man im Delphi irgendwo mitten im Quellcode eine Klammer { setzt, dann wird sofort der gesamte Text danach grün. Aber der nächsten Klammer müsste dann alles sofort blau sein usw.. Genau das brauch ich auch. Aber wie fang ich an?
|
|
Bergmann89
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: Mo 21.11.11 18:22
Hey,
schau dir ma SynEdit an, da is normalerweiße ein Highligher für C++ (ich glaub auch einer für Pascal) dabei, da musst du dir einfach nur angucken wie die das gemacht haben. Dann musst du dir nur noch ne eigene Highlighter-Klasse von der Basis-Highlighter-Klasse ableiten und die entsprechenden Funktionen überschreiben. Das benötigt zwar etwas Zeit, sich da rein zu fitzen, aber es lohnt sich.
Wenn ich ma Zeit finde kann ich auch mal den Highlighter, den ich mal geschrieben hab, auf die Grundfunktionen zerlegen und dir zukommen lassen...
MfG Bergmann.
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
anubis1368 
Hält's aus hier
Beiträge: 3
|
Verfasst: Mo 21.11.11 18:25
Mit SynEdit probier ich die ganze Zeit rum, da sind jede Menge Beispiele bei. Aber keines davon ist für meine Zwecke brauchbar. Es wird immer nach vorgegebenen Worten im Text gesucht. Ich habe keine festen Worte. Ich hab einfach keine Idee mehr, wie ich da jetzt noch ansetzen könnte.
|
|
Bergmann89
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: Mo 21.11.11 18:47
Hey,
hast du dazu die vorgefertigte Komponente benutzt? Da geht das nämlich nicht. Du musst dir wirklich angucken wie das beim C++ (oder Pascal) Highlighter mit den Kommentarblöcken gemacht wird und das musst du dann in einer eigenen Komponente nachbauen. Und die kannst du dann in deinem Programm benutzen.
€: guck dir das ma an, die grundlegende Idee dahinter versteht man eig relativ schnell. Du musst dann jedesmal wenn eine '(' kommt einfach einen Index um eins erhöhen und wenn eine ')' kommt wieder um eins verringern. Dann brauchst du für jede Farbe einen unterschiedlichen Token und ein entsprechende HighlighterAttribute. Und zum Schluss wertest du einfach anhand des Index aus, welchen Token du zurück geben musst, damit der Basis-Highlighter damit arbeiten kann.
MfG Bergmann.
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
anubis1368 
Hält's aus hier
Beiträge: 3
|
Verfasst: Mo 21.11.11 20:21
Ich bin dabei einen Highlighter umzuschreiben. Das mit den mehreren Tokens ist soweit klar, nur häng ich jetzt schon wieder fest.
SYN_ATTR_COMMENT: Result := fCommentAttri0;
Ich hab fCommentAttri0 - fCommentAttri9 erstellt, damit ich 10 verschiedene Farben nutzen kann.
Aber was ist mit SYN_ATTR_COMMENT? Wo ist das definiert? Da brauch ich ja auch für jedes fCommentAttri0 eineigenes.
function TSynonyms.GetDefaultAttribute(Index: integer): TSynHighLighterAttributes;
begin
case Index of
SYN_ATTR_COMMENT: Result := fCommentAttri0;
SYN_ATTR_IDENTIFIER: Result := fIdentifierAttri;
SYN_ATTR_KEYWORD: Result := fKeyAttri;
SYN_ATTR_STRING: Result := fStringAttri;
SYN_ATTR_WHITESPACE: Result := fSpaceAttri;
SYN_ATTR_SYMBOL: Result := fSymbolAttri;
else
Result := nil;
end;
end;
|
|
Bergmann89
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: Di 22.11.11 08:30
Hey,
das sind nur die Standartwerte, da musst du deine Attribute nicht unbedingt mit aufführen. Wichtig ist, das der Token vorhanden ist, und dieser dann mit dem Attribut verknüpft ist. Außerdem muss der dann bei den einzelnen Zeichen richtig gesetzt sein. Musste dir ma die Next Prozedur angucken, da beginnt die Auswertung der Zeichen...
MfG Bergmann.
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
|