![]() |
Highlighter
Hallo Leute,
könnt ihr mir eine Lösung präsentieren, mit der man am besten einen Text highlighte. Ich brauche nämlich einen Syntakhighlighter wie bei Delphi. Normal hätte ich einfach einen highlighter von SynEdit genommen, aber ich brauche einen Highlighter, der nur Begriffe makiert, die ich selber in eine Liste eintrage. Ich habe mal einen Text in einem Richedit gesucht und makiert. Das Problem ist nur, dass das nur mit dem selektierten ging. Beim OnChange-Ereignis funktioniert das deshalb nicht so gut, denn der Cursor spring immer vor das zu letzt makierte Wort. Liebe Grüße ;) |
AW: Highlighter
Du kannst bei SynEdit auch einen eigenen Highlighter definieren, so wie Du es möchtest. Schaue Dir mal die Demo HighlighterDemo von SynEdit an.
|
AW: Highlighter
Wenn der Cursor zurückspringt, dann mußt du seine Position berechnen und neu positionieren.
//EDIT: Also wenn es nicht perfekt sein muss, hier ein Ansatz von fünf Minuten. Es werden zwar nur die reservierten Wörter beachtet, aber wenn es reicht, dann reicht auch TRichEdit.:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const HT_BOLD = 'procedure,const,var,type,begin,end,with,do,unit,uses,class'; //usw. var sl: TStringList; i, p: Integer; s: String; begin with RichEdit1 do begin Lines.BeginUpdate; WordWrap := False; SelectAll; SelAttributes.Name := 'Courier New'; SelAttributes.Size := 10; sl := TStringList.Create; try sl.CommaText := HT_BOLD; for i := 0 to sl.Count - 1 do begin SelStart := 0; SelLength := 0; repeat p := FindText(sl[i], SelStart, MaxInt, [stMatchCase]); if p > -1 then begin SelStart := p; SelLength := Length(sl[i]); SelAttributes.Style := SelAttributes.Style + [fsBold]; SelAttributes.Color := clNavy; SelStart := SelStart + 1; end; until p = -1; end; finally sl.Free; end; Lines.EndUpdate; end; end; |
AW: Highlighter
Also versuch mal bitte den Quellcode ins OnKeyDown-Ereignis vom Richedit zu packen. Dann siehst du was ich meine. Bei OnChange kommt sogar ein stackoverflow^^
Das so zu machen gefällt mir mehr als einen Highlighter für Synedit zu schreiben. Wie muss der Quellcode denn richtig aussehen? So dass die Farben in Realtime geändert werden^^ und nicht via Button,... |
AW: Highlighter
Nun, wenn du dich auf mein Beispiel beziehst, dann habe ich ja auch gesagt, dass es nur eine Idee ist, mehr aber auch nicht. Aber auch zeilenweises parsen sollte nicht das Problem sein, sogar einfacher und schneller. Aber von alleine geht es auch nicht. Vielleicht ist in deinem Fall Synedit besser.
|
AW: Highlighter
SynEdit ist auf jeden Fall deutlich schneller. Insbesondere bei der gezeigten Implementierung, da dort nach jedem Schlüsselwort der komplette Text durchsucht wird. :shock:
Gerade so ein Highlighter muss extrem schnell sein. Da geht ohne einen zumindest parserähnlichen Ansatz nicht viel. |
AW: Highlighter
Das klappt auch mit RichEdit einigermaßen, nur muß man das leicht optimieren. So läßt man den Parser nur in der aktuellen Zeile laufen. So muß RichEdit nicht den kompletten Text durchsuchen, und eine Zeile geht schnell. Wobei ich zugeben muß, dass ab einer bestimmten Länge Zeichen in der Zeile, sagen wir mal als Hausnummer 500, könnte die Zeile schon gering flackern. Ich hab mal etwas gemacht wo RichEdit auf jede Taste reagierte. Da fing es nach paar hundert Zeichen zu blinzeln. Auch wenn das in der Praxis kaum vorkommen sollte.
Aber trotzdem, wozu das Rad neu erfinden? Sehr viele Editoren nutzen Synedit. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06: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