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