![]() |
StringList Textblöcke verschieben
Ich nutze eine StringList, um den Inhalt einer Textdatei zwischenzuspeichern und vorrätig zu halten. Für diesen speziellen Typ Dateiinhalt brauche ich kein Klassensystem oder sowas.
Wie verschiebt man am besten Textblöcke von denen ich die Indexe von Anfang bis Ende weiß, komplett an eine neue Position? Ich hätte vielleicht eine Idee aber ich frage lieber hier nochmal nach, ob ihr eine saubere oder schon fertige Lösung kennt. |
AW: StringList Textblöcke verschieben
Also sowas wie: Verschiebe zehn Zeilen ab Zeile 80 vor die Zeile 40?
|
AW: StringList Textblöcke verschieben
Genau. Oder andersherum Zeile 80 bis 89 an Zeile 130 verschieben. Das sind jetzt nur zufällige Zahlen.
|
AW: StringList Textblöcke verschieben
Hallo,
das sind Inserts (for-Schleife) und Deletes. Wo ist das Problem? |
AW: StringList Textblöcke verschieben
Mein Problem ist, dass ich nicht weiß wie man das ordentlich umsetzt. Ich würde jetzt diese sagen wir mal 20 Zeilen in eine zweite StringList speichern und in die andere neu reinspeichern.
|
AW: StringList Textblöcke verschieben
Hm,
früher hatten wir mal das geg ges Ist doch nur ein bisserl InsertInto (=Copy) und danach das Entfernen des Org.Strings. Ich würde einfach ein neues (leeres) Projekt machen und das dort Testen. Button1Click->mach was oder wer angeben will -> DUnit(xxx) |
AW: StringList Textblöcke verschieben
Ich würde das ungefähr so realisieren
Delphi-Quellcode:
Ich hab nur keine Ahnung ob die Indizies passen und ob das Insert so funktioniert wie ich mir das denke.
for i:=startline+countlines-1 downto startline do
begin sl.insert(targetline,sl[i]); sl.delete(i); end; Performanter wäre auf jeden Fall die Pointer auf den Text zu verschieben, da soweit ich weiß eine Stringliste intern ein Array of pointer to string. Aber so weit bin ich nie in die Sourcen vorgedrungen. Darum verwende ich immer noch gerne doppelt verkettete Listen. Gruß K-H |
AW: StringList Textblöcke verschieben
Delphi-Quellcode:
wenn targetline = 10
for i:=startline+countlines-1 downto startline do
begin sl.insert(targetline,sl[i]); sl.delete(i); end; 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:
(ungetestet hingedaddelt.)
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; |
AW: StringList Textblöcke verschieben
Zitat:
Gruß K-H |
AW: StringList Textblöcke verschieben
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.
Die Verschiebeaktionen mit Delete und Insert halte ich für recht (zeit)aufwendig. Das konkrete Ergebnis hängt aber sicher auch immer von der Länge der StringList und des zu verschiebenden Blockes ab. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz