AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Stringgrösse in einem Record ändern

Ein Thema von oldmann · begonnen am 24. Sep 2024 · letzter Beitrag vom 26. Sep 2024
Antwort Antwort
oldmann

Registriert seit: 10. Okt 2008
Ort: Weyhe
151 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Stringgrösse in einem Record ändern

  Alt 24. Sep 2024, 18:45
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
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
717 Beiträge
 
Delphi XE5 Professional
 
#2

AW: Stringgrösse in einem Record ändern

  Alt 24. Sep 2024, 20:10
Vermutlich bleibt Dir nichts anderes übrig, als die "alten" Daten einzulesen und im neuen Format umzuspeichern.
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Stringgrösse in einem Record ändern

  Alt 24. Sep 2024, 20: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
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.535 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Stringgrösse in einem Record ändern

  Alt 25. Sep 2024, 05:29
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!

Geändert von jaenicke (25. Sep 2024 um 05:33 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.575 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: Stringgrösse in einem Record ändern

  Alt 25. Sep 2024, 08:53
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 "Tomes of Delphi". Darin wird in einem Header u.a. der Name und eine Feldbeschreibung des gespeicherten Records geschrieben. Das hat noch den Vorteil, dass wir dafür einen generischen Viewer bauen konnten.

Zusätzlich haben wir noch eine Prüfsumme und Metadaten für die ganze Datei eingebaut.
Thomas Mueller

Geändert von dummzeuch (25. Sep 2024 um 08:56 Uhr)
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.458 Beiträge
 
Delphi 12 Athens
 
#6

AW: Stringgrösse in einem Record ändern

  Alt Gestern, 12:54
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.
  Mit Zitat antworten Zitat
oldmann

Registriert seit: 10. Okt 2008
Ort: Weyhe
151 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

AW: Stringgrösse in einem Record ändern

  Alt Gestern, 16:21
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.844 Beiträge
 
Delphi 12 Athens
 
#8

AW: Stringgrösse in einem Record ändern

  Alt Gestern, 16:58
oder besser gleich in was Anderem speichern, welches sich zukünftig problemloser ändern lässt.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:14 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz