AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Unterschiede bei TTime bzw. TDateTime zwischen Delphi 3 und Delphi 2010 ?
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von runningsoft · begonnen am 14. Mär 2013 · letzter Beitrag vom 15. Mär 2013
Antwort Antwort
Benutzerbild von runningsoft
runningsoft

Registriert seit: 8. Okt 2004
Ort: Bernau
108 Beiträge
 
Delphi 10.4 Sydney
 
#1

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

  Alt 14. Mär 2013, 14:19
Delphi-Version: 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.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.201 Beiträge
 
Delphi 10.4 Sydney
 
#2

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

  Alt 14. Mär 2013, 14:26
ergänze mal ein packed:

TZwischenZeiten = packed record
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von runningsoft
runningsoft

Registriert seit: 8. Okt 2004
Ort: Bernau
108 Beiträge
 
Delphi 10.4 Sydney
 
#3

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

  Alt 14. Mär 2013, 14:50
Danke für den Hinweis, aber das war's leider noch nicht. Die alten Dateien bleiben nach wie vor unlesbar.
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.416 Beiträge
 
Delphi XE5 Professional
 
#4

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

  Alt 14. Mär 2013, 15:16
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.
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.201 Beiträge
 
Delphi 10.4 Sydney
 
#5

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

  Alt 14. Mär 2013, 15:40
Strings sind ggf. utf-16 also 2 Byte pro Char.
Für String mit Klammer? Sollte 1 Byte char bleiben

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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#6

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

  Alt 14. Mär 2013, 15:57
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,

Geändert von gammatester (14. Mär 2013 um 16:02 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von runningsoft
runningsoft

Registriert seit: 8. Okt 2004
Ort: Bernau
108 Beiträge
 
Delphi 10.4 Sydney
 
#7

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

  Alt 14. Mär 2013, 19:49
Danke für Eure Hilfe. Der Zusatz {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.
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#8

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

  Alt 15. Mär 2013, 09:57
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.
  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 14:46 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