AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi 2009 und Datei I/O bzw. "absolute" hat sich geändert?
Thema durchsuchen
Ansicht
Themen-Optionen

Delphi 2009 und Datei I/O bzw. "absolute" hat sich geändert?

Ein Thema von Poolspieler · begonnen am 19. Jul 2009 · letzter Beitrag vom 19. Jul 2009
Antwort Antwort
Poolspieler

Registriert seit: 9. Aug 2004
165 Beiträge
 
Delphi 10.3 Rio
 
#1

Delphi 2009 und Datei I/O bzw. "absolute" hat sich

  Alt 19. Jul 2009, 14:53
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...

Gruß,
Poolspieler
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Delphi 2009 und Datei I/O bzw. "absolute" hat

  Alt 19. Jul 2009, 15:03
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.
Dazu gibt's hier aber Lösungen ... wenn man sucht!
Hier im Forum suchenRCxDecode
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Poolspieler

Registriert seit: 9. Aug 2004
165 Beiträge
 
Delphi 10.3 Rio
 
#3

Re: Delphi 2009 und Datei I/O bzw. "absolute" hat

  Alt 19. Jul 2009, 15:32
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
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Delphi 2009 und Datei I/O bzw. "absolute" hat

  Alt 19. Jul 2009, 15:41
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
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
procedure RCxDecode(pRCx: PRCxContext; pSource: PByteArray; pDest: PByteArray; Count: Integer);
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Insider2004
(Gast)

n/a Beiträge
 
#5

Re: Delphi 2009 und Datei I/O bzw. "absolute" hat

  Alt 19. Jul 2009, 17:06
Schreibe da, wo "Char" steht "AnsiChar". Dann geht es auch in Delphi 2009.
  Mit Zitat antworten Zitat
Poolspieler

Registriert seit: 9. Aug 2004
165 Beiträge
 
Delphi 10.3 Rio
 
#6

Re: Delphi 2009 und Datei I/O bzw. "absolute" hat

  Alt 19. Jul 2009, 17:11
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
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Delphi 2009 und Datei I/O bzw. "absolute" hat

  Alt 19. Jul 2009, 17:25
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
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Poolspieler

Registriert seit: 9. Aug 2004
165 Beiträge
 
Delphi 10.3 Rio
 
#8

Re: Delphi 2009 und Datei I/O bzw. "absolute" hat

  Alt 19. Jul 2009, 17:36
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?

Gruß,
Poolspieler
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Delphi 2009 und Datei I/O bzw. "absolute" hat

  Alt 19. Jul 2009, 17:43
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 )
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  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 00:37 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