Deklariere zwei Versionen des Records.
Delphi-Quellcode:
type
energieV1 = Record
monat: String[15];
Energieart: string[10];
// ...
end;
energieV2 = Record
monat: String[15];
Energieart: string[15];
// ...
public
class operator Implicit(A: energieV1): energieV2; overload;
end;
energie = energieV2;
...
class operator energieV2.Implicit(A: energieV1): energieV2;
begin
Result.monat := A.monat;
Result.Energieart := A.Energieart;
// ...
end;
Beim Lesen und Schreiben neuer Dateien verwendest du energieV2, beim Lesen alter Dateien energieV1. Das Schreiben des alten Formats solltest du vermeiden, da es zu Datenverlust führen kann. Wie du eine Datei im alten Format erkennen kannst, musst du selbst entscheiden (z.B. andere Extension oder eine definierte Signatur, die nicht mit dem V1-Record kollidiert).
Mit dem implicit operator kannst du einen V1-Record einfach einem V2-Record zuweisen.
Delphi-Quellcode:
procedure Lies(out Rec: energie1); overload; ...
procedure Lies(out Rec: energie2); overload; ...
procedure LiesRecord(out Rec: energie);
var
RecV1: energieV1;
begin
if IsFormatV1 then begin
Lies(RecV1);
Rec := RecV1;
end
else
Lies(Rec);
end;
Die Typen mit den Versionsnummern würde ich beibehalten, da vermutlich irgendwann wieder eine Erweiterung ansteht.
Um den Code kompatibel zu halten, habe ich den Alias eingeführt. Bei den Lese-/Schreib-Methoden solltest du die versionierten Typnamen verwenden. Dann können die beim Versionswechsel so bleiben.