Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi 2009 und Datei I/O bzw. "absolute" hat sich geändert? (https://www.delphipraxis.net/137361-delphi-2009-und-datei-i-o-bzw-absolute-hat-sich-geaendert.html)

Poolspieler 19. Jul 2009 13:53


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

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:
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;
Wie gesagt, unter BDS2006 läuft alles bestens - unter Delphi 2009 nicht. Hat jemand eine Idee?
Ausser BDS2006 weiter zu verwenden... :wink:

Gruß,
Poolspieler

himitsu 19. Jul 2009 14:03

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!
Hier im Forum suchenRCxDecode

Poolspieler 19. Jul 2009 14:32

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

himitsu 19. Jul 2009 14:41

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:
procedure RCxDecode(var RCx: TRCxContext; const Source; var Dest; Count: Integer);
var
  S: TByteArray absolute Source;
  O: TByteArray absolute Dest;
enspricht praktisch diesem
Delphi-Quellcode:
procedure RCxDecode(var RCx: TRCxContext; const Source: TByteArray; var Dest: TByteArray; Count: Integer);
nur daß man da die Funktion nicht auf einen festen Typen festlegt

und im Prinzip kommt es am Ende auf dieses raus
Delphi-Quellcode:
procedure RCxDecode(pRCx: PRCxContext; pSource: PByteArray; pDest: PByteArray; Count: Integer);

Insider2004 19. Jul 2009 16:06

Re: Delphi 2009 und Datei I/O bzw. "absolute" hat
 
Schreibe da, wo "Char" steht "AnsiChar". Dann geht es auch in Delphi 2009.

Poolspieler 19. Jul 2009 16:11

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

himitsu 19. Jul 2009 16:25

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

Poolspieler 19. Jul 2009 16:36

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

himitsu 19. Jul 2009 16:43

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 13:27 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