Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

AW: Miration von Delphi 7 tu Delphi XE6

  Alt 28. Aug 2014, 21:16
PChar ist ein dynamischer Typ, welcher sich mit dem Compiler anpasst.

Wenn sich also die Daten im MemoryStream nicht in ihrem Format geändert haben, ist und war schon immer PAnsiChar das Richtige.


Und man mag es nicht glauben, aber wenn du im Debugger mal nachsehn würdest, dann würdest du mitbekommen, was bei PChar für ein Text aus dem Stream ausgelesen wird.
Mauszeiger hinter die Klammer vom PChar(...) , also zwischen das )) , oder das PChar(MyStream.Memory) in die "Überwachten Ausdrücke" rein.
Oder per ShowMessageDebugging ShowMessage(PChar(MyStream.Memory)); .

Da es sich hier aber nicht wirklich um einen PAnsiChar handelt und um die Möglichkeit einer Zugriffsfehlers auszuschließen, denn das passiert schnell mal, wenn in der Datei kein #0 vorkommt, solltest du das auch nicht als PAnsiChar auswerten.
Und spaßig ist es, wenn du eine sehr große Datei da drin hast, welche keine #0 enthält, dann wird erstmal versucht alles in einen AnsiString umzuwandeln, welches an Pos übergeben wird. Ein OutOfMemry wäre doch nett?

Delphi-Quellcode:
type
  TMyRecord = array[0..3] of AnsiChar;
  PMyRecord = ^TMyRecord;
var
  X: array[0..3] of AnsiChar;

MyStream.Position := 0;
if (MyStream.Read(X, 4) = 4) and (X = '%PDF') then // vielleicht auch (AnsiString(X) = '%PDF') oder CompareMemory mit dem nächsten X

X := '%PDF';
if (MyStream.Size >= 4) and CompareMemory(@X, MyStream.Memory, 4) then

if (MyStream.Size >= 4) and (PMyRecord(MyStream.Memory)^ = '%PDF') then
Und es gibt noch viele weitere Möglichkeiten.

PS: Es gibt inzwischen viele neue und praktische Funktione (vorallem in der StrUtils), welcher man statt Pos inzwischen verwenden darf und die richtlich das Prüfen, was man eigentlich prüfen wollte.
if StartsStr('%PDF', PAnsiChar(MyStream.Memory)) then (auch wenn es hier Speicherzugriffstechnisch die selben Probleme gäbe, wie beim Pos, da es den selben PAnsiChar-Zugriff gibt)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (28. Aug 2014 um 21:38 Uhr)
  Mit Zitat antworten Zitat