AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Miration von Delphi 7 zu Delphi XE6
Thema durchsuchen
Ansicht
Themen-Optionen

Miration von Delphi 7 zu Delphi XE6

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

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.378 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)
Ein Therapeut entspricht 1024 Gigapeut.

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

 

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 10:42 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz