TStringList Delete

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
Antworten
Benutzeravatar
Swirl
Beiträge: 93
Registriert: Fr 7. Aug 2015, 14:05
OS, Lazarus, FPC: Win 10/11/ Mint 21.3 / Lazarus 30 / FPC 3.2.2
CPU-Target: x86_64, ARM Cort.-A7
Wohnort: Schwerte NRW

TStringList Delete

Beitrag von Swirl »

Hallo in's Forum,

habe das u.g. Problem - Mein Codeschnipsel:

******************************************************************************************************
...
Liste := TStringList.Create;
...
Liste.Add(UTF8ToAnsi(Zeile)); // und das ca. 100-mal
Liste.Delete(1); // soll 'raus, da nicht relevant
Liste.SaveToFile('D:\Test.txt');
...
Liste.Free;
******************************************************************************************************
Wenn ich mir jetzt die Datei »Test.txt« anschaue, ist ALLES ab der 2. Zeile (incl.) gelöscht.
Zur Visualisierung des Problems habe ich vor »SaveToFile« ein »Memo1.Lines.Assign(Liste);«
eingefügt. Es sind alle Zeilen vorhanden und das Einzelzeilen-Löschen innerhalb des Memos
klappt problemlos. Nur eben nicht in »Liste«. Dort ist dann alles ab der gewählten Zeile futsch.
Da ich den Verdacht hatte, dass in der Datei zwar alles schön zeilenweise (mit Umbruch) lesbar
ist, aber dass ab der 2 Zeile in »Liste« jedoch quasi nur ein Einzeiler »d'rin ist« habe ich auf
»Liste.delete(2)« geändert. Et voila: »List index (2) out of bounds«.
Was mich dann aber wundert, ist, dass wenn ich ohne das »Delete« arbeite, kann ich im Hex-
Editor sehen, dass Am Ende jeder Zeile ein Carriagereturn/Linefeed steht. Stehe jetzt auf
dem Schlauch...

Hoffe es ist einigermaßen verständlich geschildert.

Mein System:
Win7 64bit - Lazarus 1.4.0 - FPC 2.6.4 - SVN 48774

Gruß,
Swirl
=> Mint 21.3 “Virginia” - Win 10/11 - Lazarus 3.0 - FPC 3.2.2

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: TStringList Delete

Beitrag von mschnell »

Zeige vor Liste.Delete Liste.Count an um zu sehen wie viele Einträge wirklich drin sind.

-Michael

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: TStringList Delete

Beitrag von theo »

@Swirl: Hänge doch mal ein minimales Projekt an (zip), welches das beobachtete Verhalten zeigt. Inklusive den Inhalten von "Zeile" die du einfügst.
So kann man wenig sagen.

Benutzeravatar
Swirl
Beiträge: 93
Registriert: Fr 7. Aug 2015, 14:05
OS, Lazarus, FPC: Win 10/11/ Mint 21.3 / Lazarus 30 / FPC 3.2.2
CPU-Target: x86_64, ARM Cort.-A7
Wohnort: Schwerte NRW

Re: TStringList Delete

Beitrag von Swirl »

Mann seid Ihr schnell - besten Dank Michael und Theo!

den Tip von Michael habe ich beherzigt, ».Count« zeigt mir 159 an, das entspricht der Menge der Zeilen,
die in der gespeicherten Liste ohne Delete zu sehen sind.
Der Aufforderung von Theo wollte ich mit einem Minimalprojekt nachkommen. Damit hatte ich jedoch ein
neues Problem; ich konnte nämlich mein altes Problem nicht reproduzieren. Dies hängt wohl mit der Art
des Auslesens der Quelldaten aus einem Stringgrid nebst einfügen von Tabs (#9) zusammen. Da ich Euch
aber nicht mein Gesamtprojekt zumuten möchte, werde ich in den nächsten Tagen versuchen, mein Problem
in ein kleines Projekt zu »destillieren«...

Besten Dank einstweilen,
Michael

p.s.: 'ne halbe Stunde später
Ich glaube, ich brauche 'mal 'ne Woche Urlaub...

frmLDIF.Caption := IntToStr(Liste.Count);
//Liste.Delete(1);
Dieser Code gibt mir in meiner Form.Caption die o.g. »159« - klar, da wird ja auch nix deleted.

frmLDIF.Caption := IntToStr(Liste.Count);
Liste.Delete(1);
Dieser Code gibt mir in meiner Form.Caption eine »2« - das Delete steht aber wohlgemerkt HINTER
dem Anzeigen des .Count. Wie kann das Count wissen, dass hinterher 'nen Delete kommt? Sorry für
das Simpel-Sprech, aber da habe ich wohl irgendwas GANZ FALSCH verstanden :(
=> Mint 21.3 “Virginia” - Win 10/11 - Lazarus 3.0 - FPC 3.2.2

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: TStringList Delete

Beitrag von m.fuchs »

Irgendwas läuft da falsch. Und die Tatsache dass du in einem Minimalbeispiel das Problem nicht reproduzieren kannst, sagt dir dass irgendetwas anderes daran schuld ist.

Nimm deinen jetzigen Code, mach eine Kopie davon und versuch diese immer weiter einzudampfen, bis das Problem gefunden ist.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6200
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: TStringList Delete

Beitrag von af0815 »

Ist das Problem auch mit dem Debugger nachvollziehbar ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Swirl
Beiträge: 93
Registriert: Fr 7. Aug 2015, 14:05
OS, Lazarus, FPC: Win 10/11/ Mint 21.3 / Lazarus 30 / FPC 3.2.2
CPU-Target: x86_64, ARM Cort.-A7
Wohnort: Schwerte NRW

Re: TStringList Delete

Beitrag von Swirl »

Besten Dank auch an m.fuchs und af0815,

ich kombiniere Euer »eindampfen« und »Debugger« am Mittw/Don. (bin heute ziemlich im Stress)
Asche auf mein Haupt, aber den Debugger hatte ich für die letzte Testphase wg. des (bekannten)
FileOpenDialog-Problems weggeklemmt...

Gruß,
Michael
=> Mint 21.3 “Virginia” - Win 10/11 - Lazarus 3.0 - FPC 3.2.2

rvk
Beiträge: 2
Registriert: Do 21. Aug 2014, 00:49
OS, Lazarus, FPC: Win7 64 bit, Laz trunk, FPC trunk
CPU-Target: 32Bit

Re: TStringList Delete

Beitrag von rvk »

Swirl hat geschrieben:... aber den Debugger hatte ich für die letzte Testphase wg. des (bekannten) FileOpenDialog-Problems weggeklemmt...

Tools > Options > Debugger > General: set DisableLoadSymbolsForLibraries to true
und Sie können den Debugger erneut verwenden.

Ich denke, dass Ihr tstringlist.delete mehrmals aufgerufen wird.
Sie könnten versuchen, dies zu überprüfen.

Code: Alles auswählen

frmLDIF.Caption := frmLDIF.Caption + ' ' +IntToStr(Liste.Count);
Liste.Delete(1);

Benutzeravatar
Swirl
Beiträge: 93
Registriert: Fr 7. Aug 2015, 14:05
OS, Lazarus, FPC: Win 10/11/ Mint 21.3 / Lazarus 30 / FPC 3.2.2
CPU-Target: x86_64, ARM Cort.-A7
Wohnort: Schwerte NRW

Re: TStringList Delete

Beitrag von Swirl »

rvk hat geschrieben:Tools > Options > Debugger > General: set DisableLoadSymbolsForLibraries to true
und Sie können den Debugger erneut verwenden.


...Habe ich gemacht, kann jetzt wenigstens ohne den nervigen Ausstieg weiter debuggen.

Das mit dem mehrmaligen Aufruf schließe ich erstmal aus, habe meine Schleifen dahingehend
untersucht. Vermute eher, dass mir Steuerzeichen dazwischenpfuschen - übernehme die Daten
für die Stringliste aus einem Grid, in das ich vorher vermutlich etwas 'reingeschrieben habe,
was »nicht sichtbar« ist.

Besten Dank. Versuche jetzt, mein Problem weiter runterzudrillen. Werde mich bei dann melden.

Michael
=> Mint 21.3 “Virginia” - Win 10/11 - Lazarus 3.0 - FPC 3.2.2

Antworten