Autor Beitrag
galagher
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mi 19.02.14 19:47 
Hallo!

Ich verwende TDataFile: www.torry.net/quicks...tafile&Title=Yes
Dabei tritt ein seltsamer Effekt auf:
Bei Programmstart lese ich mit ReadStrings aus einer Datei in eine TStringList ein. Nun lösche ich Teile eines Eintrags aus einer TStringList und speichere diese am Programmende mit WriteStrings als Datei ab. Die TStringList enthält nach dem Ändern die korrekten Daten, die Änderung ist zur Laufzeit vorhanden, doch beim nächsten Programmstart, wenn ich mit ReadStrings einlese, ist die Änderung weg und die alten Daten sind wieder da!

Wenn ich testweise zwischendurch per Buttonklick speichere und danach wieder einlese, ist alles korrekt. Zur Sicherheit habe ich beim Programmende WriteStrings auskommentiert. Beim nächsten Programmstart sind wieder die alten Daten da.
Und jetzt das Beste: Wenn ich Strings anfüge, klappt es! Nur beim Entfernen oder ändern vorhandener Strings tritt der Fehler auf.
Ich kann ausschliessen, dass nicht in die gleiche Datei geschrieben wird, aus der eingelesen wird.

Einlesen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
  dat := TDataFile.Create(AppDataDir+'Data.dat');  //AppDataDir ist eine Stringvariable und hat einen gültigen Ordner als Wert!
  try
    dat.ReadStrings('Data''Synonym', SynonymeL);
  finally
    dat.Free;
  end;


Die Änderung selbst ist ebenfalls unspektakulär:
ausblenden Delphi-Quelltext
1:
2:
3:
i := 100;  //Nur als Beispiel!
s1 := 'Meine Änderung';
SynonymeL[i] := s1; //


Speichern:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
  dat := TDataFile.Create(AppDataDir+'Data.dat');  //AppDataDir ist eine Stringvariable und hat einen gültigen Ordner als Wert!
  try
    dat.WriteStrings('Data''Synonym', SynonymeL);
  finally
    dat.Free;
  end;


Ich verstehe nicht, was da falsch läuft!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Mi 19.02.14 19:59 
Hast Du mal einen Haltepunkt bei der OnClose-Prozedure (Speichern der Daten) gesetzt? Werden die Daten geschrieben, oder tritt da ein Fehler auf? Und wenn es String-Daten sind, ist das Ganze eine Text-Datei? Dann kannst Du ja mal die Datei selber in den Editor laden und testen, ob die Daten wirklich geschrieben wurden. Vielleicht ist ja aus irgendeinem Grund die Datei offen, so dass sie nicht beschrieben und die neuen Daten gespeichert werden können.

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.

Für diesen Beitrag haben gedankt: galagher
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mi 19.02.14 20:15 
user profile iconTranx hat folgendes geschrieben Zum zitierten Posting springen:
Hast Du mal einen Haltepunkt bei der OnClose-Prozedure (Speichern der Daten) gesetzt? Werden die Daten geschrieben, oder tritt da ein Fehler auf?
Die Daten werden ohne Fehler geschrieben.

user profile iconTranx hat folgendes geschrieben Zum zitierten Posting springen:
Und wenn es String-Daten sind, ist das Ganze eine Text-Datei? Dann kannst Du ja mal die Datei selber in den Editor laden und testen, ob die Daten wirklich geschrieben wurden.
Wenn ich zwischendurch testweise per Button-Klick speichere, auch als Textdatei, sind die Änderungen korrekt vorhanden. Wenn ich in der OnClose-Prozedur oder im OnCloseQuery als Text-Datei speichere, dann auch, die TStringList enthält die Änderung.

user profile iconTranx hat folgendes geschrieben Zum zitierten Posting springen:
Vielleicht ist ja aus irgendeinem Grund die Datei offen, so dass sie nicht beschrieben und die neuen Daten gespeichert werden können.
Ist nicht offen und wird erst zum Schreiben geöffnet.

Wie gesagt, wenn ich Text anfüge, wird dieser mit gespeichert, nur das Entfernen von Text nicht! :nixweiss:

//Edit:
Wenn ich bei Programmende mit WriteStrings in eine andere Datei schreibe, ist ebenfalls alles immer richtig.
Kann das an der Dateigrösse von 4,47 MB, wobei aber die zu speichernde Liste wesentlich kleiner ist, liegen?

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mi 19.02.14 22:39 
Ich habe die Datei gelöscht, neu erzeugt und jetzt funktioniert es. Könnte sein, dass sie beschädigt war und daher nicht korrekt gelesen oder geschrieben werden konnte. Vielleicht war der Abschnitt doppelt vorhanden, was weiss ich!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!