Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Datentypen Delphi1 -> Delphi5 (https://www.delphipraxis.net/29229-datentypen-delphi1-delphi5.html)

dango 6. Sep 2004 10:14


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

Hansa 6. Sep 2004 10:20

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.

himitsu 6. Sep 2004 10:21

Re: Datentypen Delphi1 -> Delphi5
 
ShortInt und ShortString (ShortString, oder String[x]) sollten sich nicht geändert haben, also muß nur Integer angepass werden

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

Mario 6. Sep 2004 10:28

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.

himitsu 6. Sep 2004 10:49

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:
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;
aber wenn nicht, dann wird es schin schwieriger:
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:
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;
Was der Fall sein wird, kannst du wohl nur Testen, oder versuchen auszurechnen
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

...

dango 6. Sep 2004 14:53

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 04:52 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