Frage

Ich habe die Quelle eines älteren Projekts erhalten und müssen kleine Dinge ändern, aber ich habe große Probleme, weil ich nur Delphi 2010 hatte.

Es gibt einen Datensatz definiert: generasacodicetagpre.

Später wird diese Definition verwendet, um aus der Datei zu lesen: generasacodicetagpre.

Das primäre Problem ist, dass der Compiler den Typ "String" in der Datensatz nicht akzeptiert, da er eine "Finalisierung" will. Also habe ich versucht, "String" auf "String [255]" oder "Nortring" zu ändern.Dadurch wird die App die Datei gelesen, jedoch mit falschem Inhalt.

Meine Frage ist, wie Sie den alten "String" -Typ konvertieren, mit dem die Dateien in die "neuen" Typen in Delphi 2010 geschrieben wurden.

Ich habe schon viel versucht, z."{$ H-}".Das Hinzufügen von nur einem Zeichen in den Datensätzen ist korrekt, die Datei ist korrekt, da die Datei nahezu korrekt gelesen wird, aber ein Zeichen mehr in jedem Datensatz abgeschnitten istp>

War es hilfreich?

Lösung

Eek! Es sieht so aus, als ob Ihr Code entweder vorab datiert oder keine langen Zeichenfolgen verwendet. Wenn Sie das gleiche Verhalten wie in Ihrem alten Delphi erzielen möchten, müssen Sie den string durch den ShortString ersetzen.

Ich sehe, dass Sie das bereits versucht haben und melde, dass es fehlschlägt. Es ist wirklich die einzige Erklärung, die für mich Sinn macht, da alle anderen Zeichenfolgentypen im Wesentlichen Zeiger sind und der read nur mit einem ShortString hätte funktionieren können. Die Migration, die Sie versuchen, ist immens und Sie haben wahrscheinlich eine große Anzahl verwirrender Probleme.

@LU RD macht in den Kommentaren deutlich, dass das Datensatzlayout zwischen den Delphi-Versionen unterschiedlich sein kann, da Sie kein packed-Array verwenden. Sie können das Datensatzlayout mit den beiden verfügbaren Delphi-Versionen untersuchen. Sie müssen sicherstellen, dass die Größe der Datensätze zwischen den Versionen übereinstimmt und dass auch die Offsets zu den Feldern übereinstimmen.

Basierend auf den folgenden Kommentaren können Sie Ihre Probleme beheben, indem Sie ein Auffüllbyte zwischen pos und nr hinzufügen.

bbil = record
  path : string;
  pos: byte;
  _pad: byte;
  nr: Word;
end;

Sie können den gleichen Effekt auch erzielen, indem Sie den $ALIGN -Compiler festlegen Option zum {$ALIGN ON}, wie ich denke, würde ich Dinge tun.

Auf lange Sicht sollten Sie sich wirklich von kurzen Zeichenfolgen, ANSI-Codierung, direkter Zuordnung zwischen Ihren internen Datensätzen und Ihren Datendateien usw. fernhalten. Kurzfristig ist es möglicherweise besser, die gleiche Version von Delphi zu erwerben, mit der dieser Code erstellt und verwendet wurde. Ich würde erwarten, dass dieses Problem nur die Spitze des Eisbergs ist.

Andere Tipps

Denken Sie nur an:

"String" <> "String [255]" <> "shortstring" <> Ansistring

zurück in alten Dos / Turbo Pascal-Tagen, "Saiten" waren in der Tat auf 255 Zeichen beschränkt. In einem großen Teil, da das 1. Byte die Stringlänge enthielt, und ein Byte kann nur einen Wert zwischen 0 und 255 haben.

das ist in zeitgenössischen Versionen von Delphi kein Problem mehr.

" shortstring " ist der Typ für den alten DOS / PASCAL String-Typ.

"longstring" war seit langem der Standardzeichentyp (einschließlich des Borland Delphi 2006, den ich derzeit für die meisten Produktionsarbeit verwende). Von Delphi 3 .. Delphi 2009, Longstrings 8-Bit-Zeichen gehalten, und wurden nur durch verfügbare Speicher begrenzt. Von Delphi 3 .. Delphi 2009, "Longstrings" waren auch mit "Ansistrings".

Die jüngsten Versionen von Delphi (Delphi 2009 und höher, einschließlich der neuen Delphi XE2), alle nun standardmäßig auf Multi-Byte Unicode "Breitenring" -Streffer. Weitersteigs , wie Ansistrings, sind in maximaler Länge auch effektiv "unbegrenzt".

Dieser Artikel erläutert näher:

http://delphi.about.com/od/beghinners/l/ AA071800A.HTM

ps: Überlegen Sie mit "Sizeof (BBIL)" und " verpackt " für binäre Datensätze .

Vielleicht übersehe ich etwas, aber so wie ich es sehe, ist auch Ihr Delphi 3-Code kaputt.Versuchen Sie, die Größe Ihres Datensatzes zu bestimmen:

bbil = record
  path : string;
  pos: byte;
  nr: Word;
end;

Pfad (alles zwischen 1 und 256 - ein Byte für die Länge, Rest für Daten), pos (1 Byte), nr (2 Byte), wodurch die Größe Ihrer Datensatzdaten von 1 + 1 + 2= 4 Byte bis 256 variiert+ 1 + 2= 259 Bytes.Unter diesen Umständen würden Sie auf jeden Fall Müll aus der Datei bekommen, da Ihr Programm jetzt nicht mehr wissen kann, wie viele Bytes gelesen werden sollen, bevor die Daten tatsächlich gelesen werden.Ich schlage vor, Sie korrigieren Ihren Datensatz so, dass die Zeichenfolge eine feste Größe hat, z. B.:

path : ShortString[255];

Dann können Sie sowohl in Delphi 3 als auch in 2010 gut schreiben und lesen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top