Das kann man noch einkürzen:
Delphi-Quellcode:
Procedure TForm1.HighlightText;
Var
ii,i2 : Integer;
sLwcLine : String;
Procedure _HighlightWord (Const aWord : String; aColor : TColor);
Var
p : Integer;
Begin
If aWord='' Then Exit;
p := Pos (aWord, sLwcLine);
If p>0 Then Begin
mmoLines.SelStart := p + i2 - 1;
mmoLines.SelLength := Length(aWord);
mmoLines.SelAttributes.Color := aColor ;
mmoLInes.SelAttributes.Style := [fsBold];
mmoLines.SelLength := 0;
End;
End;
Begin
if (text<>'') OR (text2<>'') OR (text3<>'') then begin
i2 := 0; // Variable i2 muss initialisiert werden !
text := LowerCase(text);
text2 := LowerCase(text2);
text3 := LowerCase(text3);
mmoLines.Lines.BeginUpdate;
Try
for ii := 0 to FSelect.Count-1 do begin
sLwcLine := LowerCase(FSelect[ii]);
If sLwcLine<>'' Then Begin
_HighLightWord (text, c);
_HighLightWord (text2, c2);
_HighLightWord (text3, c3);
End;
i2 := i2 + Length(FSelect.Strings[ii]) + 2;
End;
Finally
mmoLines.Lines.EndUpdate;
End
End;
End;
Das 'highlighten' habe ich in eine lokale Prozedure ausgelagert, das Begin/Endupdate in Resourcenschutzblöcke gepackt, das LowerCase(FSelect[ii]) herausgezogen und die Variable 'i2' initialisiert (wieso heißt 'i2' eigentlich 'i2' und nicht z.B. 'iLineIndex'?).
Jetzt ist es etwas übersichtlicher.
@jfHeins: Bei deiner Lösung ist der große Pferdefuß die Generierung des 'Textes'. Ich vermute, Du meinst 'MyRichEdit.Lines.Text'. Das ist Speicher- und Zeitverschwendung, denn der 'Text' wird aus den Zeilen durch Stringkonkatenation gebildet. Ich denke, der Code ist schon ganz ok, die POS-Funktion könnte man noch durch eine schnellere Variante ersetzen (z.B. eine von FastCode oder FastStrings). Wenn man den Textpuffer
direkt ansprechen könnte, wäre deine Variante aber sicherlich viel performanter.