![]() |
Delphi 2009 und Datei I/O bzw. "absolute" hat sich
Hallo,
ich habe mir gerade die Trial von Delphi 2009 installiert. Mein Delphiprojekt (BDS2006) funktionierte bisher Fehlerfrei. Unter Delphi 2009 gibt es aber Probleme: Problem1 mit Datei I/O:
Delphi-Quellcode:
Da ich hier bereits einen Workaround hätte handelt es sich eher um eine Verständnisfrage. Dass es hier nicht sonderlich elegant ist, jedes einzelne Zeichen zu lesen, ist mir klar. Aber ich verwende dieses Read-Konstrukt auch für andere binäre Daten, die dann sofort Byteweise verarbeitet werden...
function TTest.daten_aus_datei_lesen(_dateiname: string): string;
var _daten: string; F: file of char; // wenn ich F zum Typ TextFile mache, dann geht es c: char; begin try AssignFile(F, _dateiname); Reset(F); _daten := ''; while not eof(f) do begin Read(F, c); // hier werden ZWEI Bytes gelesen - obwohl F doch vom Typ char ist...??? Verstehe ich nicht! _daten := _daten + c; end; CloseFile(F); except _daten := ''; end; Result := _daten; end; Problem2 (ohne Lösung): Dieser Code ist nicht von mir persönlich geschrieben - deshalb tue ich mich mit dem Debugging auch erstmal schwer. (Ich habe bisher auch noch keine absolute-Anweisungen verwendet... Wobei S ja eigentlich einfach auf Source "zeigen" sollte...)
Delphi-Quellcode:
Wie gesagt, unter BDS2006 läuft alles bestens - unter Delphi 2009 nicht. Hat jemand eine Idee?
procedure RCxDecode(var RCx: TRCxContext; const Source; var Dest; Count: Integer);
var S: TByteArray absolute Source; // ich denke, dass das Problem mit dieser absolute Anweisung zu tun hat O: TByteArray absolute Dest; C: Integer; T,K: Byte; begin with RCx do for C := 0 to Count -1 do begin Inc(I); T := D[I]; Inc(J, T); D[I] := D[J] xor F; D[J] := T - F; Inc(T, D[I]); K := S[C] xor D[T]; // wenn ich hier einen Breakpoint setze, dann kann S nicht angezeigt werden - weil wegoptimiert O[C] := K; F := F xor K; end; end; Ausser BDS2006 weiter zu verwenden... :wink: Gruß, Poolspieler |
Re: Delphi 2009 und Datei I/O bzw. "absolute" hat
TextFile entspricht in etwa File of AnsiChar
Wenn du eine UnicodeDatei haben willst, dann solltest du eine TStringList nutzen und die Kodierung entsprechend ändern. ansonsten 1 Frage pro Thread RCxDecode ist selber aber OK, ich vermute einfach mal, daß der Aufruf nicht korrekt ist oder eine der anderen zugehörigen Funktionen, bzw. die Definition der Typen. (welches du hier nicht zeigst) Diese Funktion arbeitet normalerweise Bytemäßig und wenn du da einen UnicodeString über angibst, dann solltest du schon Chars in Bytes umrechen. :zwinker: Dazu gibt's hier aber Lösungen ... wenn man sucht! ![]() |
Re: Delphi 2009 und Datei I/O bzw. "absolute" hat
Hallo himitsu,
danke für Deine Antwort. Auf die Idee, direkt nach RCxDecode zu suchen bin ich leider nicht gekommen. Ich ging ja davon aus, dass der Fehler bei "absolute" oder so liegt - und habe in der falschen Richtung gesucht... Dein Hinweis war gut. Ich habe jetzt die Änderungen zu AnsiString vorgenommen - und die RCxDecode-Geschichte funktioniert wieder *freu* Danke und Gruß, Poolspieler |
Re: Delphi 2009 und Datei I/O bzw. "absolute" hat
nee nee, das Absolute gibt nur an, daß die beiden Variablen den selben Speicherbereich nutzen,
sie sind praktisch ein und die selbe Variable. dieses
Delphi-Quellcode:
enspricht praktisch diesem
procedure RCxDecode(var RCx: TRCxContext; const Source; var Dest; Count: Integer);
var S: TByteArray absolute Source; O: TByteArray absolute Dest;
Delphi-Quellcode:
nur daß man da die Funktion nicht auf einen festen Typen festlegt
procedure RCxDecode(var RCx: TRCxContext; const Source: TByteArray; var Dest: TByteArray; Count: Integer);
und im Prinzip kommt es am Ende auf dieses raus
Delphi-Quellcode:
procedure RCxDecode(pRCx: PRCxContext; pSource: PByteArray; pDest: PByteArray; Count: Integer);
|
Re: Delphi 2009 und Datei I/O bzw. "absolute" hat
Schreibe da, wo "Char" steht "AnsiChar". Dann geht es auch in Delphi 2009.
|
Re: Delphi 2009 und Datei I/O bzw. "absolute" hat
Hallo,
vielen Dank für Eure Antworten. Es funktioniert jetzt wie gesagt. Ich habe String durch AnsiString bzw. Char durch AnsiChar ersetzt. Jetzt versuche ich gerade zu verstehen, wo eigentlich das Problem genau lag: In BDS2006 steht "string" standardmässig (je nach Compilerschalter) für "AnsiString". OK. Aber für was steht in Delphi 2009 "string"? Und warum kann man in Delphi 2009 anscheinend KEINE binären Daten mehr in einen String schreiben??? Die Hilfe war bei der Trialversion von Delphi2009 leider nicht dabei - oder kann es mir von Euch einer erklären? Gruß, Poolspieler |
Re: Delphi 2009 und Datei I/O bzw. "absolute" hat
Delphi 1: String = ShortString (glaub ich)
bis Delphi 2007: String = AnsiString Delphi 2009: String = UnicodeString UnicodeString gibt es nur in D2009 und es stellt einen "nativen" Delphistring dar, halt nur als Unicode es gibt aber einen inoffiziellen Patch, welcher Delphi 2009 zu großen Teilen auf Ansi ustellen soll WideString = auch Unicode, aber dieser ist nur 'ne Umleitung zum OLE-String |
Re: Delphi 2009 und Datei I/O bzw. "absolute" hat
Hallo himitsu,
habe auch gerade nach Unicode-Strings (WideChar) geschaut. Mein Borland Delphi5 Buch sagt dazu, dass es sich dabei um Strings handelt, bei denen jedes Zeichen ZWEI Bytes hat. Es lassen sich damit also bis zu 65536 Zeichen kodieren. Das erklärt dann auch warum im Beispiel ganz oben mit Read aus einem "file of char" ZWEI zeichen gelesen wurden... Ok. Das habe ich verstanden. Aber wie geht man nun in der Praxis bei relativ großen Projekten (Sourcecode hat ca. 1 MB) damit um? Soll man nach dem von Dir angesprochenen inoffiziellen Patch suchen. Oder soll man eher seinen ganzen Sourcecode umstricken??? Falls umstricken<>false: - nach welchen Regeln sollte man seinen Code anpassen - ich denke, dass man alle Strings, die reinen Text (wie z.B. Fehlermeldungen) enthalten so lassen kann - man braucht "nur" die Stellen anschauen, wo "binäre Daten" im String stehen - oder? Gibt es da draussen evtl. Leidensgenossen mit einer guten Lösung? :shock: Gruß, Poolspieler |
Re: Delphi 2009 und Datei I/O bzw. "absolute" hat
wenn du keine direkten "binäroperationen" mit den Strings machst und bei längenangaben alles mit SizeOf(Char) multiplizerst, dann kannst du alles auf String / Char einstellen und es läuft in allen Delphi-Versionen mit den "standardfunktionen"
wenn du irgendwo den String direkt manipulieren willst, wo es auch noch auf jedes Byte ankommt, dann entscheide dich entweder für AnsiString/PAnsiChar oder WideString/PWideChar, denn dann ist in allen Delphis gleich JA, ANSI = 1 Byte und Unicode (genauer UCS-2) = 2 Byte, wobei es theoretisch schon lange noch UCS-4 gibt = 4 Byte pro Zeichen (leider ist die Umsetzung davon in Delphi echt grauenhaft und der UCS4String ist nichtmal kompatibel zu den AnsiString/WideStrings ... und keine automatische Umwandlung und Dergleichen :evil: ) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:09 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 by Thomas Breitkreuz