Einzelnen Beitrag anzeigen

Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#3

AW: Stringgrösse in einem Record ändern

  Alt 24. Sep 2024, 21:56
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat