ListBox arbeitet intern mit einer Stringliste, es bringt also nichts, den Inhalt zu kopieren. Mit PosEx ist es sowieso viel schneller, denn der Bottleneck ist eindeutig die Verwendung von 'Copy'.
Ich habe den Code mal mit PosEx mit 20.000 Zeilen getestet (600k Text), Ohne Begin/EndUpdate, Suche direkt in der Listbox. Ergebnis: 200ms, um ein nicht existentes Wort in dem Text zu finden.
Dann habe ich den Text der Listbox vorher in einen String kopiert (fText := MyListBox.Items.Text). Das dauert 350ms. Dafür dauert das Suchen dann direkt in diesem String gemessene 0ms (also nicht meßbar).
Fazit: Wenn Du in einer sich nicht häufig ändernden Liste suchst, würde ich den Umweg über die Konvertierung in einen String gehen, sonst eben direkt in der Liste suchen (mit For-Schleife und PosEx).
Delphi-Quellcode:
procedure TForm1.btFindFirstClick(Sender: TObject);
begin
fText := lb.items.text;
fPos := 0;
btSearchAgainClick(Sender);
end;
procedure TForm1.btFindAgainClick(Sender: TObject);
Var
p,iLine,iCol : Integer;
Procedure _CalcLineAndCol (aPos : Integer;
Var aLine, aCol : Integer);
Var
i, iLineStart : Integer;
Begin
aLine := 1;
For i:=1
to aPos
do
If Ftext[i]=#10
Then Begin
iLineStart := i;
inc(aLine);
End;
aCol := aPos - iLineStart;
End;
begin
p := csstrings.PosEx(edSearch.Text, fText,fPos+1);
if p>0
Then Begin
_CalcLineAndCol(p, iLine, iCol);
lb.TopIndex := max(iLine-3, 1);
fPos := p+Length (edSearch.Text)-1;
End Else Raise Exception.Create('
Suchstring nicht gefunden');
end;