Delphi-Quellcode:
for i:=startline+countlines-1 downto startline do
begin
sl.insert(targetline,sl[i]);
sl.delete(i);
end;
wenn targetline = 10
und i = 7
dann wird aus sl.insert(targetline,sl[i]); -> sl.insert(7,sl[10]);
Die nachfolgenden Zeilen werden dadurch nach "hinten" verschoben.
Die ursprüngliche Zeile 10 wird also zu Zeile 11.
Aus sl.delete(i); bzw. sl.delete(10); muss dann sl.delete(i + 1); also sl.delete(11); werden.
Deine Routine dürfte nur dann korrekt arbeiten, wenn targetline > startline ist.
Oder irre ich da?
Eventuell sowas in der Art?
Delphi-Quellcode:
procedure VerschiebeZeilen(sl : TStringList; AStartLine : Integer; ACount : Integer; ATargetLine : Integer);
var
slTemp : TStringList;
i : Integer;
begin
slTemp := TStringList.Create;
// Die zu verschiebenden Zeilen sammeln.
for i := AStartLine to AStartLine + ACount - 1 do slTemp.Add(sl[i]);
// Nun die zu verschiebenden Zeilen löschen
// Es wird immer AStartLine gelöscht, da dadurch die nachfolgenden Zeilen "nach vorne rutschen".
for i := 1 to ACount do sl.Delete(AStartLine);
// Und anschließend an der gewünschten Position einfügen.
// Dabei wird mit der letzten Zeile der gesammelten Zeilen begonnen,
// da diese bei jedem Einfügen einer neuen Zeile nach "hinten" verschoben werden.
// Im Ergebnis bleibt dadurch die ursprüngliche Reihenfolge erhalten.
for i := slTemp.Count - 1 downto 0 do sl.Insert(ATargetLine,slTemp[i]); // Hier war im Ursprung ein Fehler, es wurde sl[i] eingefügt, was absoluter Quatsch war und ist.
slTemp.Free;
end;
(ungetestet hingedaddelt.)