Entwickler-Ecke

Dateizugriff - "Altes" Array in "Neues" (erweitertes) Array laden


Crowbar - Sa 10.11.07 19:45
Titel: "Altes" Array in "Neues" (erweitertes) Array laden
Hallo,
ich habe ein Array und Lade/Speicher dieses über TFileStream in eine bzw. aus einer Datei. Alles Ok!
So, nun habe ich aber mein Array erweitert.

Um es aber kompatible mit den "alten" abgespeicherten Dateien zu halten und um keinen Fehler bzw. "Überladungen" beim Laden der Array-Felder in das "erweiterte" Array zu erhalten, muss ich irgendwie Abfragen, wieviele Felder es im Array gibt. Also, in meinem Beispiel, ob es 2 oder 3 Felder gibt.
Nur wie?

"Alter" Record:

Delphi-Quelltext
1:
2:
3:
4:
TTestRecord = Record
               Name,
               Einheit : String;
             end;

"Neuer" (erweiterter) Record:

Delphi-Quelltext
1:
2:
3:
4:
5:
TTestRecord = Record
               Name,
               Nummer,
               Einheit : String;
              end;


Gruß
Crowbar

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt


BenBE - Sa 10.11.07 21:29

Records und Arrays sind was Grundverschiedenes ;-)

Im Grunde aber einfach Feldweise kopieren ...


dummzeuch - Sa 10.11.07 23:11
Titel: Re: "Altes" Array in "Neues" (erweitertes) Array laden
user profile iconCrowbar hat folgendes geschrieben:
ich habe ein Array und Lade/Speicher dieses über TFileStream in eine bzw. aus einer Datei. Alles Ok!
So, nun habe ich aber mein Array erweitert.

Um es aber kompatible mit den "alten" abgespeicherten Dateien zu halten und um keinen Fehler bzw. "Überladungen" beim Laden der Array-Felder in das "erweiterte" Array zu erhalten, muss ich irgendwie Abfragen, wieviele Felder es im Array gibt. Also, in meinem Beispiel, ob es 2 oder 3 Felder gibt.
Nur wie?

"Alter" Record:

Quelltext
1:
2:
3:
4:
TTestRecord = Record
               Name,
               Einheit : String;
             end;

"Neuer" (erweiterter) Record:

Quelltext
1:
2:
3:
4:
5:
TTestRecord = Record
               Name,
               Nummer,
               Einheit : String;
              end;


Die Groesse eines Records (in Bytes) bekommst Du mit SizeOf. Allerdings hilft Dir das nicht viel, wenn Du feststellen willst, ob eine Datei die alten oder die neuen Records enthaelt, denn es gibt ja immer das KGV (Hey, wer haette gedacht, dass man Grundschulkenntnisse bei der Programmierung gebrauchen kann? ;-) ) aus den beiden.

Normalerweise macht man das dann so, dass man der neuen Datei einen Header verpasst, in dem eine Versionsnummer drinsteht und evtl. die Groesse der darin gespeicherten Records. Dann kann man spaeter immer feststellen, welchen Recordtyp man darin abgespeichert hat. Um ganz sicher zu gehen, kann man dem Header noch eine "Magische Zahl" voranstellen, von der man sicher ist, dass sie in der Datei ohne Header (also der alten) nicht am Anfang stehen kann.

Hilft das?

twm


Crowbar - So 11.11.07 13:54

@BenBE: Du hast Recht. :wink:
Ich verwende den Record als "Array". Das habe ich in meinem ersten Posting vergessen zu schreiben. :roll:

Delphi-Quelltext
1:
TTestArray    = Array of TTestRecord;                    

@dummzeuch:
An die "Versionsnummer" im Datei-Header habe ich auch schon gedacht. ... nur für die "alten" Dateien ist es zu spät.

Aber
user profile icondummzeuch hat folgendes geschrieben:
... Um ganz sicher zu gehen, kann man dem Header noch eine "Magische Zahl" voranstellen, von der man sicher ist, dass sie in der Datei ohne Header (also der alten) nicht am Anfang stehen kann.

ist ein guter Ansatz für mich.

Vielen Dank!

Gruß Crowbar