Autor Beitrag
Crowbar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 180

WinXP, SP2
D6 Enterprise
BeitragVerfasst: Sa 10.11.07 19:45 
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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
TTestRecord = Record
               Name,
               Einheit : String;
             end;

"Neuer" (erweiterter) Record:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Sa 10.11.07 21:29 
Records und Arrays sind was Grundverschiedenes ;-)

Im Grunde aber einfach Feldweise kopieren ...

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
dummzeuch
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 593
Erhaltene Danke: 5


Delphi 5 ent, Delphi 6 bis Delphi XE8 pro
BeitragVerfasst: Sa 10.11.07 23:11 
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:
ausblenden Quelltext
1:
2:
3:
4:
TTestRecord = Record
               Name,
               Einheit : String;
             end;

"Neuer" (erweiterter) Record:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 180

WinXP, SP2
D6 Enterprise
BeitragVerfasst: 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:
ausblenden 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