AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Highlighter

Ein Thema von mb1996 · begonnen am 27. Okt 2012 · letzter Beitrag vom 28. Okt 2012
Antwort Antwort
mb1996

Registriert seit: 30. Dez 2009
243 Beiträge
 
Delphi 2009 Professional
 
#1

Highlighter

  Alt 27. Okt 2012, 20:11
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
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#2

AW: Highlighter

  Alt 27. Okt 2012, 20:26
Du kannst bei SynEdit auch einen eigenen Highlighter definieren, so wie Du es möchtest. Schaue Dir mal die Demo HighlighterDemo von SynEdit an.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#3

AW: Highlighter

  Alt 27. Okt 2012, 22:08
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;

Geändert von Popov (27. Okt 2012 um 22:19 Uhr)
  Mit Zitat antworten Zitat
mb1996

Registriert seit: 30. Dez 2009
243 Beiträge
 
Delphi 2009 Professional
 
#4

AW: Highlighter

  Alt 28. Okt 2012, 16:45
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,...
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#5

AW: Highlighter

  Alt 28. Okt 2012, 17:31
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.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.582 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Highlighter

  Alt 28. Okt 2012, 17:35
SynEdit ist auf jeden Fall deutlich schneller. Insbesondere bei der gezeigten Implementierung, da dort nach jedem Schlüsselwort der komplette Text durchsucht wird.

Gerade so ein Highlighter muss extrem schnell sein. Da geht ohne einen zumindest parserähnlichen Ansatz nicht viel.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#7

AW: Highlighter

  Alt 28. Okt 2012, 23:54
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:51 Uhr.
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