Nein, Laufzeit-Fehler treten bei mir nicht auf.
Ich habe mir den Code jetzt genauer angesehen. Die von mir verlinkte Funktion FindTextAll() enthält genau die Bremse, vor der ich dich warnen wollte. Hier die korrigierte Fassung:
Delphi-Quellcode:
function FindTextAll(re: TRichEdit; const sText: string;
options: TSearchTypes): TIntegerDynArray;
var
iStart, iFound, iLength: Integer;
begin
SetLength(Result, 0);
iStart := 0;
iLength := Length(re.Text); // re.Lines.Text war fatal
while iStart < (iLength - Length(sText)) do
begin
iFound := re.FindText(sText, iStart, iLength - iStart, options);
if iFound = -1 then Break;
SetLength(Result, Succ(Length(Result)));
Result[High(Result)] := iFound;
iStart := iFound + Length(sText);
end;
end;
Den Geschwindigkeitsvorteil ziehst du in deinem Code aus zwei fiesen Tricks: Du suchst immer nur nach dem ersten Treffer, weitere ignorierst du, und du verkleinerst den Suchbereich mit jedem Treffer. Wird ein Suchwort am Ende des Textes gefunden, dann beginnst du mit der Suche nach dem nächsten Suchwort direkt hinter dem vorigen Treffer. Dein Text enthält 34.630 Zeichen, insgesamt durchsucht werden bei dir 35.037 Zeichen. Bei etwa gleichmäßig im Text verteilten Suchwörtern müsstest du aber pro einfachem Treffer etwa 17.315 Zeichen untersuchen, bei 410 Durchläufen sind das etwa 7MB. Mein Code findet übrigens 483 Treffer.
Der Vergleich der beiden Lösungen hinkt ein wenig, meinst du nicht auch?