Ich möchte ja keine Zeilen vertauschen sondern nur einen Block von oben irgendwo ganz nach unten verschieben.
Du hast offenbar den Algorithmus noch nicht durchschaut. Deswegen erläutere ich das mal:
Zunächst füge ich an der Zielposition eine ausreichende Anzahl Leerzeilen ein:
Delphi-Quellcode:
for I := 0 to ACount - 1 do
lst.Insert(ATargetLine, '');
Dann korrigiere ich den Wert von ASourceLine, falls sich die entsprechenden Zeilen durch das Einfügen nach hinten verschoben haben:
Delphi-Quellcode:
if ATargetLine < ASourceLine then
ASourceLine := ASourceLine + ACount;
Nun tausche ich die zu verschiebenden Zeilen mit den gerade eingefügten Leerzeilen aus:
Delphi-Quellcode:
for I := 0 to ACount - 1 do
lst.Exchange(ASourceLine + I, ATargetLine + I);
Damit landen die zu verschiebenden Zeilen schon mal an der gewünschten Zielposition und an der ursprünglichen Position sind nun die Leerzeilen.
Im letzten Schritt werden diese Leerzeilen wieder gelöscht:
Delphi-Quellcode:
for I := 0 to ACount - 1 do
lst.Delete(ASourceLine);