Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Unterschiede bei TTime bzw. TDateTime zwischen Delphi 3 und Delphi 2010 ? (https://www.delphipraxis.net/173752-unterschiede-bei-ttime-bzw-tdatetime-zwischen-delphi-3-und-delphi-2010-a.html)

runningsoft 14. Mär 2013 13:19

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:
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;
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.

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.

Bernhard Geyer 14. Mär 2013 13:26

AW: Unterschiede bei TTime bzw. TDateTime zwischen Delphi 3 und Delphi 2010 ?
 
ergänze mal ein packed:

Delphi-Quellcode:
TZwischenZeiten = packed record

runningsoft 14. Mär 2013 13:50

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.

generic 14. Mär 2013 14:16

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.

Bernhard Geyer 14. Mär 2013 14:40

AW: Unterschiede bei TTime bzw. TDateTime zwischen Delphi 3 und Delphi 2010 ?
 
Zitat:

Zitat von generic (Beitrag 1207404)
Strings sind ggf. utf-16 also 2 Byte pro Char.

Für String mit Klammer? Sollte 1 Byte char bleiben

Zitat:

Zitat von generic (Beitrag 1207404)
An 64 Bit Probleme gedacht?

D2010?

Also ich denke eher das unter D3 kein Align erzeugt wurde was jetzt unter D2010 der Fall ist:

Code:
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
Oder war mal TDateTime ein extended-Wert (10 bytes) was bei Align = 4 zu 168 Byte führen würde.

gammatester 14. Mär 2013 14:57

AW: Unterschiede bei TTime bzw. TDateTime zwischen Delphi 3 und Delphi 2010 ?
 
Richtig!
Delphi-Quellcode:
{$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;
Dies ergibt für Delphi6 bis 17(XE3) ein sizeof(TZwischenZeiten)=164.

Edit: packed liefert allerdings 161 Byte, da Du die beiden Strings um je 1 Byte zu kurz angesetzt hast,

runningsoft 14. Mär 2013 18:49

AW: Unterschiede bei TTime bzw. TDateTime zwischen Delphi 3 und Delphi 2010 ?
 
Danke für Eure Hilfe. Der Zusatz
Delphi-Quellcode:
{align 4}
hats dann gebracht.

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.

gammatester 15. Mär 2013 08:57

AW: Unterschiede bei TTime bzw. TDateTime zwischen Delphi 3 und Delphi 2010 ?
 
Zitat:

Zitat von runningsoft (Beitrag 1207445)
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.

Wenn Du keine obskuren Sachen machst, und nicht in jeder Unit eine neue Typdeklaration vornimmst, sollte die Sache doch völlig transparent sein (insbesondere muß nichts im Rest des Programms geändert werden). {$align} ist eine lokale Einstellung. In der Unit, in der TZwischenZeiten definiert wird, steht halt im Interface-Teil
Delphi-Quellcode:
{$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 Units, die diese Definition verwenden, arbeiten dann automatisch mit den Dword-aligned Records der Länge 164.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:13 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