![]() |
Datentypen Delphi1 -> Delphi5
Hallo !
Ich habe seinerzeit in Delphi1 (16Bit) ein Programm geschrieben, das seine Daten in typisierten Dateien ablegt (mit record und so). Jetzt muss ich in Delphi5 (32Bit) Routinen schreiben, mit denen ich diese Daten lesen und in ein neues Programm importieren kann. Der Record-Typ für eine der Dateien sah damals so aus:
Delphi-Quellcode:
Integer hatte damals 16Bit und hat heute 32Bit. Folglich verwende ich im record meines Delphi5-Programms stattdessen Smallint. Prinzipiell müsste das doch dann funktionieren, oder ? Beim Lesen der Daten zeigt sich aber, dass sie innerhalb des records "verschoben" sind (d.h. die Länge nicht stimmt). Außerdem bekomme ich beim letzten Datensatz den Fehler "Lesen nach Dateiende".
type
kauf_verk = record art : shortint; tier : integer; name : string[15]; vorohr : string[15]; vermart: string[15]; datum : string[10]; adrnr : string[4]; grund : string[30]; end; Muss ich da noch was beachten ? String[15] bleibt doch z.B. string[15] und an shortint hat sich doch eigentlich auch nix geändert ?!? Danke schonmal ! Daniel |
Re: Datentypen Delphi1 -> Delphi5
Du mußt mal nach den Compiler-Schaltern gucken. Ein 16 Bit String z.B. ist ab D3 ein ShortString. Um das immer so zu definieren wäre (*$H-*) das richtige. Für die Zahlen gibt es ähnliches.
|
Re: Datentypen Delphi1 -> Delphi5
ShortInt und ShortString (ShortString, oder String[x]) sollten sich nicht geändert haben, also muß nur Integer angepass werden
Code:
Ich empfehle dir bei solchen festen Datentypen auch nie generische Datentypen (z.B. siehe OH "Integer-Typen") zu verwenden, da diese sich ja ändern können
type
kauf_verk = record art : shortint; tier : [color=red]smallint[/color]; name : string[15]; vorohr : string[15]; vermart: string[15]; datum : string[10]; adrnr : string[4]; grund : string[30]; end; |
Re: Datentypen Delphi1 -> Delphi5
Noch eins. Delphi richtet standardmäßig die Records in 4Byte-Schritten aus. Das könnte noch ein Problem sein. Lies mal bei packed record in der Hilfe nach.
|
Re: Datentypen Delphi1 -> Delphi5
stimmt ja @Mario, das hätte ich ja beinahe vergessen, allerdings weiß ich nicht, ob D1 das auch schon machte (also vermutlich bei 16 Bit), oder ob's da noch nicht so war (also ohne Ausrichtung)
wenn's da nicht ausgerichtet wurde, dann kannst du einfach das verwenden
Delphi-Quellcode:
aber wenn nicht, dann wird es schin schwieriger:
type
kauf_verk = packed record art : shortint; tier : smallint; name : string[15]; vorohr : string[15]; vermart: string[15]; datum : string[10]; adrnr : string[4]; grund : string[30]; end; falls es da auch bei 32 Bit (4 Byte) ausgerichtet wurde, dann kanst du's ohne das PACKED machen (wird aber wohl nicht der Fall sein) Also bei 16 Bit mußt du's wohl packen und ein paar Füllbits einfügen
Delphi-Quellcode:
Was der Fall sein wird, kannst du wohl nur Testen, oder versuchen auszurechnen
type
kauf_verk = packed record art : shortint; _FB1 : Byte; tier : smallint; name : string[15]; _FB2 : Byte; vorohr : string[15]; _FB3 : Byte; vermart: string[15]; _FB4 : Byte; datum : string[10]; adrnr : string[4]; grund : string[30]; end; Dateigröße / 92 = ...,0 > packed Dateigröße / 96 = ...,0 > mit 16 Bit-Ausrichtung (2 Byte) Dateigröße / 102 = ...,0 > mit 32 Bit-Ausrichtung (4 Byte) (wenn ich mich nicht verrechnet hab) oder Dateigröße / Datensatzanzahl (wenn bekannt) = 92 > packed = 96 > 16 Bit = 102 > 32 Bit ... |
Re: Datentypen Delphi1 -> Delphi5
Hi @all !
Absoluter Volltreffer !! Delphi 1 hat das nämlich noch nicht gemacht... War schon ganz stolz, dass ich die Lösung eben in einem uralten Delphi 2 - Buch :nerd: unter "Compiler-Konfiguration" gefunden habe (geht nämlich auch mit {$A-}) und wollte es hier posten - aber da wart Ihr wohl schneller -> RESPEKT. Hätte ich zwischen 11:21 und 11:28 nochmal hier reingeschaut, hätte ich satte 4 1/2 Stunden gespart :wall: Ich war auch schon ziemlich stutzig geworden, weil sich beim Testen die Größe des Records nicht (immer) geändert hat, wenn ich z.B. die Länge eines Strings geändert oder ein integer durch ein smallint ersetzt habe... :lol: Egal, hauptsache es läuft jetzt... Vielen Dank !! Daniel |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:25 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