Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Miration von Delphi 7 zu Delphi XE6 (https://www.delphipraxis.net/181612-miration-von-delphi-7-zu-delphi-xe6.html)

wschrabi 28. Aug 2014 21:07


Miration von Delphi 7 zu Delphi XE6
 
Hallo Experten,
ich bin am Umschreiben von D7 Code auf XE6. Die meisten UNICODE Probleme hab ich lösen können, doch klappt folgendes nciht.

Delphi-Quellcode:
function TForm1.verfiyifok(MyStream: TMemoryStream): string;
var
  MSPosition: integer;(

begin

  MSPosition := Pos('%PDF', PChar(MyStream.Memory));

  if MSPosition > 0 then
    begin
    UpDate_LOG.Lines.Add(DateTimeToStr(Now)+': -> Artl.-Nr: '+gMyAN+' : Geladen');
    Result:='Geladen';
    end
 else
    begin
    UpDate_LOG.Lines.Add(DateTimeToStr(Now)+': -> Artl.-Nr: '+gMyAN+' : nicht geladen');
    Result:='nicht geladen';
    end;
end;
IN D7 konnte ich das %PDF am Anfang des MYSTREAM.Memory ausfindig machen. Doch in XE6 klappt es einfach nicht, er schreibt immer nicht geladen raus.
Wer weiß Rat?

Danke

himitsu 28. Aug 2014 21:16

AW: Miration von Delphi 7 tu Delphi XE6
 
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
Delphi-Quellcode:
PChar(...)
, also zwischen das
Delphi-Quellcode:
))
, oder das
Delphi-Quellcode:
PChar(MyStream.Memory)
in die "Überwachten Ausdrücke" rein.
Oder per ShowMessageDebugging
Delphi-Quellcode:
ShowMessage(PChar(MyStream.Memory));
. :stupid:

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.
Delphi-Quellcode:
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)

wschrabi 28. Aug 2014 21:40

AW: Miration von Delphi 7 tu Delphi XE6
 
Tausend DANK!, Ja ich hab das untersucht mit PCHAR() aber da stand schrott drin. weil es ja einPDF ist.
Hast mir sehr geholfen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:58 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