Hier ist meine Variante:
Delphi-Quellcode:
var SuchPos: Integer;
begin
if OpenDialog.Execute then
begin
if Length(edSuchwort.Text) > 0 then
begin
RichEdit.Lines.LoadFromFile(OpenDialog.FileName);
SuchPos := 0;
repeat
SuchPos := RichEdit.FindText(edSuchwort.Text,SuchPos,Length(RichEdit.Lines.Text),[stWholeWord]);
if SuchPos > -1 then
begin
RichEdit.SelStart := SuchPos;
RichEdit.SelLength := Length(edSuchwort.Text);
RichEdit.SelAttributes.Color := clRed;
SuchPos := SuchPos + Length(edSuchwort.Text);
end;
until SuchPos = -1;
end;
end;
end;
Ich habe keinen Vergleich, wie schnell sie ist, aber sie funktioniert, wenn auch nur mit einem Suchwort. Für weitere Wörter muss man halt erweitern. Ein paar Kleinigkeiten könnte man auch noch optimieren, z.B. SuchLaenge := Length(edSuchwort.Text); im Voraus zuweisen.
EDIT
Der Aufruf von Length scheint viel Zeit zu benötigen. Ich habe das jetzt noch einmal so probiert und der Geschwindigkeitsunterschied ist immens.
Delphi-Quellcode:
var SuchPos, SuchLaenge, RichEditLaenge: Integer;
STime, ETime: Integer;
begin
if OpenDialog.Execute then
begin
SuchLaenge := Length(edSuchwort.Text);
if SuchLaenge > 0 then
begin
RichEdit.Lines.LoadFromFile(OpenDialog.FileName);
RichEditLaenge := Length(RichEdit.Lines.Text);
STime := GetTickCount();
SuchPos := 0;
repeat
SuchPos := RichEdit.FindText(edSuchwort.Text,SuchPos,RichEditLaenge,[stWholeWord]);
if SuchPos > -1 then
begin
RichEdit.SelStart := SuchPos;
RichEdit.SelLength := SuchLaenge;
RichEdit.SelAttributes.Color := clRed;
SuchPos := SuchPos + SuchLaenge;
end;
until SuchPos = -1;
ETime := GetTickCount();
lbZeit.Caption := IntToStr(ETime - STime);
lbZeit.Visible := True;
end;
end;
end;