Einzelnen Beitrag anzeigen

nahpets
(Gast)

n/a Beiträge
 
#20

Re: Suchergbenisse farblich hinterlegen (TSynMemo)

  Alt 11. Sep 2009, 10:37
Hallo,

ein paar Stunden später:

Es geht viel einfacher:

Wir brauchen eine Routine, die uns nach dem Suchbegriff fragt:
Delphi-Quellcode:
// Der über die InputBox eingegebene Text wird im SynEdit hervorgehoben.
procedure TfmMain.acFindAndMarkExecute(Sender: TObject);
begin
  with ActiveFrameEditor.SynEdit Do begin
    If Not Assigned(SearchEngine) then begin
      SearchEngine := TSynEditSearch.Create(ActiveFrameEditor.SynEdit);
      SearchEngine.Options := [ssoReplace, ssoReplaceAll];
    end;
    SearchEngine.Pattern := '';
    Repaint; // Damit alte Markierungen entfernt werden.
    SearchEngine.Pattern := InputBox('Eingabe','Suchbegriff','');
    Repaint; // Damit neue Markierungen gesetzt werden, einmal neu zeichnen.
  end;
end;
Das OnPaint-Ereignis des SynEdit bekommt folgende Routine:
Delphi-Quellcode:
procedure TFrameEditor.SynEditPaint(Sender: TObject; ACanvas: TCanvas);
var
  i : Integer;
  j : Integer;
  P : TPoint;
begin
  with SynEdit do begin
    // Ist keine Suchmaschine zugewiesen, raus, dann können wir uns das sparen.
    If Not Assigned(SearchEngine) then Exit;
    If SearchEngine.Pattern = ''  then Exit;
    ACanvas.Font := Font; // Font des SynEdits, sonst stimmt der Schrifttyp nicht.
    ACanvas.Brush.Color := clYellow;
    ACanvas.Brush.Style := bsSolid;
    // Die Suchbegriffe werden nur im sichtbaren Bereich hervorgehoben,
    // spart bei großen Dateien viel Zeit.
    for i := TopLine - 1 to TopLine + LinesInWindow do begin
      SearchEngine.FindAll(Lines[i]);
      for j := 0 to SearchEngine.ResultCount - 1 do begin
        P := RowColumnToPixels(BufferToDisplayPos(BufferCoord(SearchEngine.Results[j], i + 1)));
        ACanvas.TextOut(P.X, P.Y, SearchEngine.Pattern);
      end;
    end;
  end;
end;
Bei Änderungen im SynEdit machen wir folgendes:
Delphi-Quellcode:
procedure TFrameEditor.SynEditChange(Sender: TObject);
begin
  SynEdit.Repaint; // Markierungen neu zeichnen
end;
Das führt dazu, dass Hervorhebungen erhalten bleiben, während man Text eingibt oder löscht...
  Mit Zitat antworten Zitat