AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

StringList Textblöcke verschieben

Ein Thema von DieDolly · begonnen am 21. Mai 2019 · letzter Beitrag vom 22. Mai 2019
Antwort Antwort
Seite 1 von 3  1 23      
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#1

StringList Textblöcke verschieben

  Alt 21. Mai 2019, 21:32
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.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: StringList Textblöcke verschieben

  Alt 21. Mai 2019, 21:44
Also sowas wie: Verschiebe zehn Zeilen ab Zeile 80 vor die Zeile 40?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#3

AW: StringList Textblöcke verschieben

  Alt 21. Mai 2019, 21:44
Genau. Oder andersherum Zeile 80 bis 89 an Zeile 130 verschieben. Das sind jetzt nur zufällige Zahlen.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: StringList Textblöcke verschieben

  Alt 21. Mai 2019, 21:47
Hallo,
das sind Inserts (for-Schleife) und Deletes.
Wo ist das Problem?
Heiko
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#5

AW: StringList Textblöcke verschieben

  Alt 21. Mai 2019, 22:00
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.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: StringList Textblöcke verschieben

  Alt 21. Mai 2019, 22:54
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)
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#7

AW: StringList Textblöcke verschieben

  Alt 22. Mai 2019, 10:12
Ich würde das ungefähr so realisieren
Delphi-Quellcode:
for i:=startline+countlines-1 downto startline do
begin
  sl.insert(targetline,sl[i]);
  sl.delete(i);
end;
Ich hab nur keine Ahnung ob die Indizies passen und ob das Insert so funktioniert wie ich mir das denke.

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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Delphi.Narium

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

AW: StringList Textblöcke verschieben

  Alt 22. Mai 2019, 11: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 13:54 Uhr) Grund: Fehler behoben sl[i] statt slTemp[i] eingefügt :-( :-( :-(
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#9

AW: StringList Textblöcke verschieben

  Alt 22. Mai 2019, 11:49

Deine Routine dürfte nur dann korrekt arbeiten, wenn targetline > startline ist.
Davon bin ich ausgegangen! ???

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: StringList Textblöcke verschieben

  Alt 22. Mai 2019, 12:42
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.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz