![]() |
Stringgrösse in einem Record ändern
Hallo,
Ich habe in einem Record unter anderen einem String, Energieart:string[10]: type energie=Record monat:String[15]; Energieart:string[10]; usw----- usw----- end; Nun müsste ich den String 'Energieart' von string[10] auf von string[15] erweitern. Das Programm läuft aber schon einige Jahre mit string[10]. Wie kann den record auf string[15] ändern, ohne dass die Dateien die bisher Erstellt wurden Probleme haben. Vielleicht gibt es ja dafür eine Lösung. Gruss oldmann |
AW: Stringgrösse in einem Record ändern
Vermutlich bleibt Dir nichts anderes übrig, als die "alten" Daten einzulesen und im neuen Format umzuspeichern. :wink:
|
AW: Stringgrösse in einem Record ändern
Deklariere zwei Versionen des Records.
Delphi-Quellcode:
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).
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; Mit dem implicit operator kannst du einen V1-Record einfach einem V2-Record zuweisen.
Delphi-Quellcode:
Die Typen mit den Versionsnummern würde ich beibehalten, da vermutlich irgendwann wieder eine Erweiterung ansteht.
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; 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. |
AW: Stringgrösse in einem Record ändern
Wobei sich auch die Frage stellt, ob es bei dieser Art der Speicherung bleiben soll. Klar, es ist einfach zu verwenden, aber bei der nächsten Anpassung stehst du wieder an der gleichen Stelle.
Alternativen gibt es viele (z.B. JSON). Aber natürlich ist der Aufwand für eine Umstellung größer. Inkompatibel mit dem vorherigen Format ist das neue Format aber in jedem Fall, auch wenn es nur ein neuer Record wird, wie Uwe ausführlich gezeigt hat. Da also ohnehin zwischen den Dateiversionen unterschieden werden muss, könnte man auch ganz etwas anderes verwenden. |
AW: Stringgrösse in einem Record ändern
Das Problem bei Uwes Vorschlag ist, wie er selbst schon schreibt, dass man beim Lesen einer Datei wissen muss, welcher Record-Typ in die Datei geschrieben wurde. Das kann schnell mal in die Hose gehen.
Wir verwenden deshalb intern ein selbstbeschreibenden File of Record Format, basierend auf dem Code aus " ![]() Zusätzlich haben wir noch eine Prüfsumme und Metadaten für die ganze Datei eingebaut. |
AW: Stringgrösse in einem Record ändern
Wenn man unbedingt abwärts kompatibel bleiben muss.
Für Energieart nur eine Kürzel speichern und die Übersetzung Kürzel zu Langbezeichnung in einer zusätzlichen Datei. Den neuen Record vor dem Speichern in den alten Record kopieren und dabei die Langbezeichnung durch das Kürzel ersetzen. Beim Lesen entsprechend umgekehrt. |
AW: Stringgrösse in einem Record ändern
Hallo,
erst einmal Danke für Eure Antworten. Die meisten waren mir schon beknnt, aber ich dachte vielleicht gibt es eine ganz einfache Lösung. Es wird mir wohl nichts anderes Übrig bleiben, als die Daten im alten Record auszulesen und in einem neue Record zu speichern. Also nochmal danke. Oldmann |
AW: Stringgrösse in einem Record ändern
oder besser gleich in was Anderem speichern, welches sich zukünftig problemloser ändern lässt.
|
AW: Stringgrösse in einem Record ändern
Hi himitsu,
Was gibt es da für Möglichkeiten? Was wäre die beste Möglichkeit? Eventuel Bespiele ? Gruss Okdmann |
AW: Stringgrösse in einem Record ändern
JSON habe ich ja schon genannt. Möglich wäre auch XML, das für Menschen besser lesbar ist.
Grundsätzlich kannst du dann entweder das Speichern und Einlesen z.B. mit superobject manuell machen oder ein Marshalling verwenden, wie hier gezeigt wird: ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz