Einzelnen Beitrag anzeigen

Delphi.Narium

Registriert seit: 27. Nov 2017
2.415 Beiträge
 
Delphi 7 Professional
 
#8

AW: StringList Textblöcke verschieben

  Alt 22. Mai 2019, 10:26
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.)

Geändert von Delphi.Narium (22. Mai 2019 um 12:54 Uhr) Grund: Fehler behoben sl[i] statt slTemp[i] eingefügt :-( :-( :-(
  Mit Zitat antworten Zitat