AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Miration von Delphi 7 zu Delphi XE6

Miration von Delphi 7 zu Delphi XE6

Ein Thema von wschrabi · begonnen am 28. Aug 2014 · letzter Beitrag vom 28. Aug 2014
Antwort Antwort
wschrabi

Registriert seit: 16. Jan 2005
367 Beiträge
 
#1

Miration von Delphi 7 zu Delphi XE6

  Alt 28. Aug 2014, 22:07
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

Geändert von TBx (29. Aug 2014 um 06:21 Uhr) Grund: Dreckfuhler beseitigt
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.737 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Miration von Delphi 7 tu Delphi XE6

  Alt 28. Aug 2014, 22: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.
Delphi-Tage 2005-2014

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

Registriert seit: 16. Jan 2005
367 Beiträge
 
#3

AW: Miration von Delphi 7 tu Delphi XE6

  Alt 28. Aug 2014, 22:40
Tausend DANK!, Ja ich hab das untersucht mit PCHAR() aber da stand schrott drin. weil es ja einPDF ist.
Hast mir sehr geholfen.

Geändert von TBx (29. Aug 2014 um 06:49 Uhr) Grund: Frage geschlossen
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 03:52 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf