Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Records in D5 und D2007 unterschiedlich (https://www.delphipraxis.net/140898-records-d5-und-d2007-unterschiedlich.html)

deadcantdance 28. Sep 2009 14:22


Records in D5 und D2007 unterschiedlich
 
Hallo,

ich portiere gerade ein Anwendung von Delphi 5 nach Delphi 2007. In der Anwendung werden viele Records eingesetzt.

Das Problem ist, dass ich mit Delphi 2007 die Records nicht mehr aus Dateien ausgelesen kann, es steht einfach Müll drin. Offensichtlich hat es damit zu tun, dass unpacked Records in Delphi 2007 wie packed Records behandelt werden.

Vielleicht hat jemand einen Tipp für mich, wie ich auch mit Delphi 2007 kompatibel bleibe, da ich unmöglich > 500 Records anpassen kann.

Viele Grüße,
deadcantdance

himitsu 28. Sep 2009 14:29

Re: Records in D5 und D2007 unterschiedlich
 
Schau mal, ob sich mit {$A...} bzw. {$ALIGN ...} etwas machen läßt

siehe [oh]$A[/oh] [oh]$ALIGN[/oh]


Aber genau das ist ein Grund, warum man von Anfang an "externe" Records NIE unpacked sein lassen sollte oder anderswie (z.B. via der Compilerschalter) für einen definierten Zustand sorgt.

[edit=mkinzler]Refresh, da Cache-zerstören nichts gebracht hat Mfg, mkinzler[/edit]

deadcantdance 28. Sep 2009 22:06

Re: Records in D5 und D2007 unterschiedlich
 
Durch einiges Probieren habe ich nun nun die Lösung. Der Record sieht so aus:

Delphi-Quellcode:
tAbc = record
  ID : integer;
  Nummer : integer;
  Name : array[0..100] of char;
  Erstellt : tDateTime;
end;
Um diesen Record in Delphi 2007 kompatibel zu machen, ändert man den Record wie folgt:

Delphi-Quellcode:
tAbc = record
  ID : integer;
  Nummer : integer;
  Name : array[0..100] of AnsiChar;
  Erstellt : tDateTime;
end;
Wichtig ist außerdem die Compiler-Einstellung bzw. -direktive {Align 8}. Dann klappts auch wieder unter Delphi 2007.

Viele Grüße,
deadcantdance

himitsu 28. Sep 2009 22:28

Re: Records in D5 und D2007 unterschiedlich
 
Zitat:

Zitat von deadcantdance
Wichtig ist außerdem die Compiler-Einstellung bzw. -direktive {Align 8}. Dann klappts auch wieder unter Delphi 2007.

eventuell auch so ... hier wird $ALIGN ignoriert
Delphi-Quellcode:
tAbc = packed record
  ID : integer;
  Nummer : integer;
  Name : array[0..100] of AnsiChar;
  _dummy: array[101..105] of AnsiChar;
  Erstellt : tDateTime;
end;
Also in Zukunft einfach immer nur Fundamentale Typen verwenden und alles als PACKED.
Generische Typen wie Integer, Cardinal, Char und String könne sich ja schnell mal ändern.

Auch Array of Record sollte man als PACKED deklarieren, da dort ebenfalls ausgerichtet werden könnte.

PS: zu Denken ein Char wäre für alles ab Delphi 2009 ein WideChar und davor ein AnsiChar,
ist nicht so optimal, da ja irgendwann die native Unterstützung von UCS4 kommt :angel2:


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