(ungetestet hingedaddelt.)
Du musst noch beachten, daß sich durch die
sl.Delete Anweisungen der effektive Wert von
ATargetLine ändern kann - nämlich dann, wenn
AStartLine < ATargetLine ist.
Ich könnte mir vorstellen, dass es i.d.R. performanter (und einfacher) ist, die Zeilen einfach komplett abschnittsweise in eine neue StringList zu kopieren.
Das Insert/Delete ist lediglich abhängig von der Anzahl der Zeilen im Block (hier 30). Mit deinem Vorschlag müssen immer alle Zeilen (80000) angefasst werden.
Hier noch eine alternative Lösung (beachtet auch eventuell hinterlegte Objects):
Delphi-Quellcode:
lst.BeginUpdate;
try
for I := 0 to ACount - 1 do
lst.Insert(ATargetLine, '');
if ATargetLine < ASourceLine then
ASourceLine := ASourceLine + ACount;
for I := 0 to ACount - 1 do
lst.Exchange(ASourceLine + I, ATargetLine + I);
for I := 0 to ACount - 1 do
lst.Delete(ASourceLine);
finally
lst.EndUpdate;
end;
Exchange tauscht intern nur die String-Pointer aus, ist also recht effizient.
Da beim
Insert/Delete immer nur Leerstrings (Nil-Pointer) betroffen sind, fällt da auch kein verdeckter Verwaltungsaufwand an.