RichEdit: Syntax Highlighting einfacher!!!
-
Hi Leute,
nen Kumpel von mir der noch Anfänger ist fragte mich gerade wie das geht mit
dem Highlighting, da Verwiess ich ihn auf die FAQ.
Doch das war im zu Kompliziert, daher habe ich ihm nen Schnippel gemacht
wo er nur noch die Wörter eintragen muß.So, da er vermutlich nicht der Einzige ist der sowas machen will, hier ist mal der Schnippel:
AnsiString worte[] = { "if", "else", "for", "int", "usw..." }; AnsiString keyword; int start; int key_anzahl = sizeof(worte) / sizeof(worte[0]); for (int i=0;i<key_anzahl;i++) { keyword = worte[i]; start = RichEdit1->Lines->Text.Pos(keyword) - 1; RichEdit1->SelStart = start; RichEdit1->SelLength = keyword.Length(); RichEdit1->SelAttributes->Color = clBlue; /* die Farbe */ RichEdit1->SelAttributes->Style = TFontStyles() << fsBold; /* Style */ }
Vieleicht kann man es ja auch bei dem Beitrag in der FAQ hinzunehmen, ist halt ne einfache Variante, auch wenn nicht die Bessere.
gruss @lle
-
Damit es nicht so lahmt sollte man (in diesem Fall) noch vor der Schleife ein RichEdit1->Lines->BeginUpdate() und dannach RichEdit1->Lines->EndUpdate() schreiben.
Und noch besser wäre es wenn man es über die API realisiert.
Und noch besser wenn man beim Tippen nach dem Wort vor dem Caret überprüft und sonst den ganzen Text.
-
Das versagt doch schon beim doppelten Auftreten eines Schlüsselwortes.
Für einen FAQ-Eintrag müsst ihr schon noch etwas daran feilen.
-
Jau hast Recht, ist mir gar nicht aufgefallen vorhin als ich das auf
die schnelle Tippte...Marco schmeiß den Code raus, habe was nicht beachtet
Gut das es den Jansen giebt
-
Hier ist was was Funktioniert, es wird direkt bei Schreiben, ändern etc.
der Heighleight erzeugt.AnsiString worte[] = { "if", "else", "for", "int", "usw..." }; /* hier einfach die Schlüsselwörter reinschreiben wie man will */ int key_anzahl = sizeof(worte) / sizeof(worte[0]); /* Anzahl der Schlüsselwörter */ //------------------------- OnChange der RichEdit --------------------------- void __fastcall TForm1::RichEdit1Change(TObject *Sender) { int cpos = RichEdit1->SelStart; for (int i=0;i<key_anzahl;i++) { if (worte[i] == RichEdit1->Lines->Text.SubString(cpos - worte[i].Length(),worte[i].Length()) && cpos >= worte[i].Length()) { RichEdit1->SelStart = cpos - worte[i].Length() - 1; RichEdit1->SelLength = worte[i].Length(); RichEdit1->SelAttributes->Color = clBlue; /* die Farbe Blau*/ RichEdit1->SelAttributes->Style = TFontStyles() << fsBold; /* Style Bold rein */ } } RichEdit1->SelStart = cpos; RichEdit1->SelAttributes->Color = clBlack; /* die Farbe Schwarz*/ RichEdit1->SelAttributes->Style = TFontStyles() >> fsBold; /* Style Bold raus*/ }
Ich hoffe das ist nun besser auch für Anfänger, trotzdem empfehle ich die Variante wie sie in den FAQ zu finden ist.
gruss @lle
-
Tja, das funktioniert aber nicht beim Laden aus einer Datei oder beim Einfügen von Text ...
-
Bei größeren Texten ist es auch nicht besonders schnell
Eine Möglichkeit es zu beschleunigen wäre es in die OnKeyUp()-Ereignisverarbeitung zu packen.
-
Stimmt @Jansen
und lahm ist es auch wenn das Array erst mal alle wörter hat.
Aber für ein Anfänger wie mein Kumpel Marco reicht es schon zum Üben.
Er versucht sich dann auch mal an den richtigen Code.Den einfachen Code könnte man z.B. so umbauen das das Proggi ein Schimpfenfinger zeigt wenn wan gerade ein böses Wort eingetippt hat, oder auch andere Varianten.