Einzelnen Beitrag anzeigen

Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#14

AW: StringList Textblöcke verschieben

  Alt 22. Mai 2019, 12:57
(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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat