Einzelnen Beitrag anzeigen

Flippo

Registriert seit: 26. Sep 2004
111 Beiträge
 
Delphi 2005 Personal
 
#1

Binärdatei auslesen - gespeichertes Objekt ist geändert

  Alt 28. Nov 2008, 17:29
Hallo zusammen,
ich habe folgendes Problem:
Das Programm speichert eine Collection Namens Elementlisten die aus Elementen vom Typ TMyElement besteht in eine Binärdatei. Die Collection wird dann später wieder aus dieser Binärdatei erzeugt. (Dabei wird der Kontruktur für jedes Einzelne Element automatisch aufgerufen). Der Konstruktur liest dann die benötigten Daten mit Hilfe der read Prozedur ein. (Am besten an dieser Stelle mal einen Blick in den Quelltext werfen, damit ihr versteht was ich zu sagen versuche )
Das Problem ist jetzt: Das Attribut Stand(ein String) hat eine neue Länge bekommen(wurde von 3 auf 5 geändert). Ich weiß leider nicht genau wie das Suchen in der Binärdatei abläuft, aber ich schätze mal er sucht nach etwas der Art "Stand: String[5]"(natürlich wird das in der Binärdatei durch wirre zeichen dargestellt). Ist die Binärdatei alt, dann steht da aber noch "Stand: String[3]" drin. Weshalb der Stand dann nicht gefunden wird, wohl bis ans ende des Streams gelaufen wird und beim ersten Zugriffsversuch auf irgendein Element der Collection eine "Schutzverletzung" kommt.
(Wenn ich Daten die von der aktuellen Version gespeichert wurden öffne gibt es keine Fehler)

Deshalb meine Fragen:
Gibt es eine Möglichkeit im Konstruktor den alten Stand auszulesen? Ich bekomme es einfach nicht hin, obwohl ich ja folgendes problemlos augelesen bekomme
Neu: TMyElementliste hat Attribut "Stand: TStandStr" (an anderer Stelle wird TStandStr: String[5] definiert). Und die einzige Änderung bekannt ist
Alt: TMyElementliste hat Attribut "Stand: TStandStr" (TStandStr hat länge 3)

Wie oder woher kann ich Informationen darüber bekommen wie diese Binärdateien aufgebaut sind? Das wurde ja alles mit Hilfe von standard Methoden da reingeschrieben.

Delphi-Quellcode:
procedure Binaerlisten_schreiben (fn : PChar);
var
  TheFile: TBufStream;
begin
  TheFile.Init(fn, stCreate, 1024);
  TheFile.Put(Elementlisten);
  TheFile.Done;
end;

{Die obere Prozedur löst wohl diese hier zum schreiben für jedes Element aus}
procedure TMyElement.Store(var s : TStream);
begin
  Application.ProcessMessages;
  S.Write(Name, SizeOf(ElementName));
  S.Write(Bereich, SizeOf(Bereich));
  S.Write(data, SizeOf(data));
  S.Write(Dateiname, SizeOf(DateiName));
  S.Write(Stand, SizeOf(Stand));
  S.Write(Numm, SizeOf(INumm));
  S.Write(Datum, SizeOf(Datum));
end;


{Hier der Kontruktor der vom einlesen Befehl aufgerufen wird}
constructor TMyElement.Load (var s : TStream);
begin
  { auf Default-Werte setzen }
  FillChar (data, sizeof(data), #0);
  isNewList := false;
  bereichIndex := 0; { wird dann im Bereiche-Setup neu gesetzt }
  s.Read(Name, sizeOf(Name));
  s.Read(bereich, sizeOf(Bereich));
  s.Read(data, sizeOf(data));
  s.Read(Dateiname, sizeOf(DateiName));
  s.Read(Stand, sizeOf(Stand)); {Hier ist das Problem}
  s.Read(Numm, sizeOf(INumm));
  s.Read(Datum, sizeOf(Datum));
end;
Ich hoffe Ihr könnt mir helfen. Danke schonmal an alle die sich hiermit befassen.

MfG

flippo
  Mit Zitat antworten Zitat