AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Datentypen Delphi1 -> Delphi5

Ein Thema von dango · begonnen am 6. Sep 2004 · letzter Beitrag vom 6. Sep 2004
Antwort Antwort
dango

Registriert seit: 6. Sep 2004
Ort: Büdingen-Büches
9 Beiträge
 
#1

Datentypen Delphi1 -> Delphi5

  Alt 6. Sep 2004, 11:14
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
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#2

Re: Datentypen Delphi1 -> Delphi5

  Alt 6. Sep 2004, 11:20
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.
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

Re: Datentypen Delphi1 -> Delphi5

  Alt 6. Sep 2004, 11:21
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
$2B or not $2B
  Mit Zitat antworten Zitat
Mario

Registriert seit: 7. Apr 2003
567 Beiträge
 
Delphi 2006 Enterprise
 
#4

Re: Datentypen Delphi1 -> Delphi5

  Alt 6. Sep 2004, 11:28
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.
Schöne Grüße,
Mario Noack
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

Re: Datentypen Delphi1 -> Delphi5

  Alt 6. Sep 2004, 11:49
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

...
$2B or not $2B
  Mit Zitat antworten Zitat
dango

Registriert seit: 6. Sep 2004
Ort: Büdingen-Büches
9 Beiträge
 
#6

Re: Datentypen Delphi1 -> Delphi5

  Alt 6. Sep 2004, 15:53
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 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 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...

Egal, hauptsache es läuft jetzt...

Vielen Dank !!
Daniel
  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 21:09 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