![]() |
Delphi-Version: 2010
Unterschiede bei TTime bzw. TDateTime zwischen Delphi 3 und Delphi 2010 ?
Hallo,
ich migriere gerade ein älteres Projekt, das noch jahrelang mit Delphi 3 gepflegt wurde auf Delphi 2010 und stoße auf ein Problem, dass offenbar in TTime oder TDateTime begründet liegt. Ich habe folgenden Record:
Delphi-Quellcode:
Vorhandene Dateien, die diese Records enthalten und mit der bisher mit Delphi 3 kompilierten Programmversion abgespeichert wurden, lassen sich nunmehr, nachdem ich das Projekt nahezu unverändert mit Delphi 2010 kompiliere, nicht mehr öffnen. Die ersten Werte - Disziplin als String und die Integerwerte Charakter, Zwischenzeiten und MaxZwischenzeiten werden noch sauber ausgelesen, aber anschließend, beim Auslesen der TTime-Werte kommt nur noch Datenmüll an.
TZwischenZeiten = record
Startnr : integer; Disziplin : String[41]; Charakter : integer; ZwischenZeiten : integer; MaxZwischenZeiten : integer; LaufZeit : array[1..11] of TTime; Uhrzeit : TDateTime; Status : String[6]; end; Auch unterscheidet sich die Dateigröße eines abgespeicherten Datensatzes zwischen der Delphi3- und der Delphi10-Programmversion. Ein Datensatz mit der Delphi10-Version des Programms abgespeichert hat eine Größe von 168 Byte, während der Datensatz der Delphi3-Version nur 164 Byte groß ist. Liege ich richtig mit meiner Vermutung, dass sich entweder TTime oder TDateTime der beiden Delphiversionen voneinander unterscheiden? Wenn ja. was könnte ich tun, um alte Dateien auf das neuere Datenformat umzuschlüsseln und wieder lesbar zu machen? Oder bin ich vielleicht ganz auf dem Holzweg :( Vielen Dank schon mal für Eure Hinweise. |
AW: Unterschiede bei TTime bzw. TDateTime zwischen Delphi 3 und Delphi 2010 ?
ergänze mal ein packed:
Delphi-Quellcode:
TZwischenZeiten = packed record
|
AW: Unterschiede bei TTime bzw. TDateTime zwischen Delphi 3 und Delphi 2010 ?
Danke für den Hinweis, aber das war's leider noch nicht. Die alten Dateien bleiben nach wie vor unlesbar.
|
AW: Unterschiede bei TTime bzw. TDateTime zwischen Delphi 3 und Delphi 2010 ?
Strings sind ggf. utf-16 also 2 Byte pro Char.
Das erklärt aber nicht die 4 Byte in Summe. An 64 Bit Probleme gedacht? Ist jetzt etwas ein Zeiger, was vorher ein Wert war? Aber am meisten habe ich das TDateTime unter verdacht. Schau dir den Speicher mal im CPU-Fenster an. Dort solltest du sehen, was jetzt Größer ist. |
AW: Unterschiede bei TTime bzw. TDateTime zwischen Delphi 3 und Delphi 2010 ?
Zitat:
Zitat:
Also ich denke eher das unter D3 kein Align erzeugt wurde was jetzt unter D2010 der Fall ist:
Code:
Oder war mal TDateTime ein extended-Wert (10 bytes) was bei Align = 4 zu 168 Byte führen würde.
Startnr : integer; 4 Byte
Disziplin : String[41]; 41 Byte Charakter : integer; 4 Byte ZwischenZeiten : integer; 4 Byte MaxZwischenZeiten : integer; 4 Byte LaufZeit : array[1..11] of TTime; 11*8 Byte Uhrzeit : TDateTime; 8 Byte Status : String[6]; 6 Byte Summe 159 Byte bei Align = 1 Byte 160 Byte bei Align = 2 Byte 164 Byte bei Align = 4 Byte |
AW: Unterschiede bei TTime bzw. TDateTime zwischen Delphi 3 und Delphi 2010 ?
Richtig!
Delphi-Quellcode:
Dies ergibt für Delphi6 bis 17(XE3) ein sizeof(TZwischenZeiten)=164.
{$align 4}
type TZwischenZeiten = record Startnr : integer; Disziplin : String[41]; Charakter : integer; ZwischenZeiten : integer; MaxZwischenZeiten : integer; LaufZeit : array[1..11] of TTime; Uhrzeit : TDateTime; Status : String[6]; end; Edit: packed liefert allerdings 161 Byte, da Du die beiden Strings um je 1 Byte zu kurz angesetzt hast, |
AW: Unterschiede bei TTime bzw. TDateTime zwischen Delphi 3 und Delphi 2010 ?
Danke für Eure Hilfe. Der Zusatz
Delphi-Quellcode:
hats dann gebracht.
{align 4}
Was bewirkt dieser Zusatz jetzt? Ich überlege jetzt, ob ich das in allen Units, in denen ich diesen Record verwende, nachtrage oder ob ich lieber eine Umschlüsselungsrountine schreibe, die immer dann, wenn eine alte Datei mit der neuen Programmversion geöffnet wird, diese umschlüsselt, so dass der Rest des Programms nicht geändert werden muss. |
AW: Unterschiede bei TTime bzw. TDateTime zwischen Delphi 3 und Delphi 2010 ?
Zitat:
Delphi-Quellcode:
Alle Units, die diese Definition verwenden, arbeiten dann automatisch mit den Dword-aligned Records der Länge 164.
{$align 4}
type TZwischenZeiten = record Startnr : integer; Disziplin : String[41]; Charakter : integer; ZwischenZeiten : integer; MaxZwischenZeiten : integer; LaufZeit : array[1..11] of TTime; Uhrzeit : TDateTime; Status : String[6]; end; {$align 8} // Rest der Unit |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:01 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