Delphi-PRAXiS

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/)
-   -   Highlighter (https://www.delphipraxis.net/171238-highlighter.html)

mb1996 27. Okt 2012 19:11

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 ;)

RWarnecke 27. Okt 2012 19:26

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.

Popov 27. Okt 2012 21:08

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;

mb1996 28. Okt 2012 15:45

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

Popov 28. Okt 2012 16:31

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.

jaenicke 28. Okt 2012 16:35

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.

Popov 28. Okt 2012 22:54

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