AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Stream Lesefunktion aus XE7 funktioniert unter D2010 nicht korrekt

Stream Lesefunktion aus XE7 funktioniert unter D2010 nicht korrekt

Ein Thema von skoschke · begonnen am 16. Mai 2019 · letzter Beitrag vom 17. Mai 2019
Antwort Antwort
skoschke

Registriert seit: 6. Jan 2009
138 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

Stream Lesefunktion aus XE7 funktioniert unter D2010 nicht korrekt

  Alt 16. Mai 2019, 12:00
Hallo,

ich komme nicht weiter, folgende Funktion (Auszug) lädt falsche Dateiinhalte bei Verwendung in D2010, unter XE7 ist es korrekt:

Delphi-Quellcode:
  
  ...
  Stream.ReadBuffer(loadcount, SizeOf(Integer)); //das sind 4 Bytes
  For i := 1 to loadcount do
  begin
    FillChar(AFieldRec, SizeOf(AFieldRec), #0);
    Stream.ReadBuffer(AFieldRec.Flags, SizeOf(LongWord)); //das sind 4 Bytes, im Original ist es DWord
    Stream.ReadBuffer(AFieldRec.Pos, SizeOf(TRect)); //16 Bytes
    if FRMVersion < 110 then
      Stream.ReadBuffer(AFieldRec.Typ, 1)
    else
      Stream.ReadBuffer(AFieldRec.Typ, SizeOf(TFieldTyp)); //2 Byte
    if AFieldRec.Typ = ft_Static then
    begin
      AFieldRec.UseTextH := true;
      Stream.ReadBuffer(TextSize, SizeOf(Integer)); //4 Bytes
      AFieldRec.TextH := GlobalAlloc(GMEM_FIXED, TextSize);
      Stream.ReadBuffer(GlobalLock(AFieldRec.TextH)^, TextSize);
    end
    else
    begin
      Stream.ReadBuffer(AFieldRec.FontSize, SizeOf(Integer)); //4 Bytes
      Stream.ReadBuffer(AFieldRec.FontAttr, SizeOf(Integer)); //4 Bytes
      Stream.ReadBuffer(AFieldRec.TextAlign, SizeOf(Integer)); //4 Bytes
      Stream.ReadBuffer(AFieldRec.TextColor, SizeOf(Integer)); //4 Bytes
      Stream.ReadBuffer(TextSize, SizeOf(Integer)); //4 Bytes
      SetLength(AFieldRec.FontName, TextSize);
      Stream.ReadBuffer(Pointer(AFieldRec.FontName)^, TextSize); //ist als TTXString deklariert
    end;
    end;
    ...
Ich habe mal meine Anzahl Bytes dahinterkommentiert.
Hat jemand eine Idee anhand des Codeschnipsels, was da schiefläuft?
Vermutung:

Delphi-Quellcode:
type
  TTXString = AnsiString;

   AFieldRec.FontName :TTXString;
Bin über jede Idde dankbar!

Ciao
Stefan
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
7.097 Beiträge
 
Delphi XE4 Professional
 
#2

AW: Stream Lesefunktion aus XE7 funktioniert unter D2010 nicht korrekt

  Alt 16. Mai 2019, 12:11
Hallo,
die Byte-Ausrichtung in Records hatte sich doch mal geändert.
Teste mal mit SizeOf, ob beide die gleiche Größe haben.

Du verheimlichst uns leider AFieldRec.

Wenn Du beide Delphis am Laufen hast,
poste doch mal den genauen (ersten) Unterschied.
Heiko

Geändert von hoika (16. Mai 2019 um 12:55 Uhr)
  Mit Zitat antworten Zitat
skoschke

Registriert seit: 6. Jan 2009
138 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#3

AW: Stream Lesefunktion aus XE7 funktioniert unter D2010 nicht korrekt

  Alt 16. Mai 2019, 12:19
AFieldRec ist ein
Delphi-Quellcode:
type
  TNewFieldRec = record
    Typ: TFieldTyp;
    Page: Integer;
    Pos: TRect;
    UseTextH: Boolean;
    TextH: THandle;
    Text: TTXString;
    TextColor: TColor;
    Flags: LongWord;
    Zoom: Integer;
    FontName:TTXString;
    FontSize: Integer;
    FontAttr: Integer;
    TextAlign: Integer;
    TXFrame: TTXFrame;
    ParentWnd: HWnd;
    AddValue: Integer;
    WndID: LongWord;
    MaxChars: Integer;
    IndexPos: Integer;
  end;
und der TTXFrame ist
Delphi-Quellcode:
type
  TTXFrame = record
    State: LongWord;
    case Integer of
      0:
        (Sizes: LongWord);
      1:
        (LineWidth: Word;
          FrameDist: Word);
  end;
Wobei ich meine, dass der Recordaufbau unerheblich ist, denn es werden ja immer einzelne Record-Inhalte geladen?

Ciao
Stefan
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
7.097 Beiträge
 
Delphi XE4 Professional
 
#4

AW: Stream Lesefunktion aus XE7 funktioniert unter D2010 nicht korrekt

  Alt 16. Mai 2019, 12:52
Hallo,
Zitat:
Wobei ich meine, dass der Recordaufbau unerheblich ist, denn es werden ja immer einzelne Record-Inhalte geladen?
fast.

Stream.ReadBuffer(AFieldRec.Typ, SizeOf(TFieldTyp)); //2 Byte

Das ReadBuffers schaltet ja Stream.Position um x Bytes weiter.
wenn TFieldType unter D2010 z.B. 3 Byte groß ist -> Puff

Ist SizeOf(TFieldTyp) bei beiden Delphis gleich?

PS:
TFieldTyp hat Du immer "unterschlagen"


SetLength(AFieldRec.FontName, TextSize);
Hier könnte es sein, dass Du die Größe von AFieldRec aus Versehen änderst, musst du prüfen.

Ausserdem würde ich mal AnsiString durch ShortString ersetzen.


Um besten debuggst Du beide Delphis einfach mal parallel.
Heiko

Geändert von hoika (16. Mai 2019 um 12:55 Uhr)
  Mit Zitat antworten Zitat
skoschke

Registriert seit: 6. Jan 2009
138 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#5

AW: Stream Lesefunktion aus XE7 funktioniert unter D2010 nicht korrekt

  Alt 16. Mai 2019, 13:08
Darauf habe ich gewartet
Ich habe nur D2010 und muss irgendwie den Code, der in XE7 entstand, zum Laufen bringen...

TFieldType ist 2 Bytes und im Stream auch an der richtigen Stelle zu finden.

SetLength(AFieldRec.FontName, TextSize); könnte die Größe verändern, sehe ich mir an...

Zitat:
Ausserdem würde ich mal AnsiString durch ShortString ersetzen.
Dann knallt es bei
Stream.ReadBuffer(Pointer(AFieldRec.FontName)^, TextSize);

Irgendwie ist mir diese Zeile unsympatisch...

Nachtrag:
Im Hexeditor kann man erkennen, dass diese Zeile 19 Zeichen zu viel liest...

Ciao
Stefan

Geändert von skoschke (16. Mai 2019 um 14:14 Uhr)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
7.097 Beiträge
 
Delphi XE4 Professional
 
#6

AW: Stream Lesefunktion aus XE7 funktioniert unter D2010 nicht korrekt

  Alt 16. Mai 2019, 15:21
Hallo,
Zitat:
Ich habe nur D2010
Die Community-Edition kann viell. helfen.

Zitat:
Stream.ReadBuffer(Pointer(AFieldRec.FontName)^, TextSize); //ist als TTXString deklariert
Das hatte ich gar nicht gesehen.
Au weia !!!

vielleicht
Stream.ReadBuffer(PAnsiChar(AFieldRec.FontName), TextSize);

oder mit GetMem/FreeMem/StrPCopy arbeiten


Wie gross ist denn TextSize?
Heiko

Geändert von hoika (16. Mai 2019 um 15:24 Uhr)
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
317 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Stream Lesefunktion aus XE7 funktioniert unter D2010 nicht korrekt

  Alt 16. Mai 2019, 16:46
Stream.ReadBuffer(Pointer(AFieldRec.FontName)^, TextSize); //ist als TTXString deklariert

Irgendwie ist mir diese Zeile unsympatisch...

Nachtrag:
Im Hexeditor kann man erkennen, dass diese Zeile 19 Zeichen zu viel liest...

Ciao
Stefan
Hat Textsize den richtigen Wert?

Anyway, ersetzte diese Zeile mal durch

Stream.ReadBuffer(AFieldRec.FontName[1], TextSize);

Da der erste Parameter von ReadBuffer ein untyped Var ist übergibt das die Addresse des ersten Zeichens der Fontname-Variablen, das sollte passen.
Peter Below
  Mit Zitat antworten Zitat
skoschke

Registriert seit: 6. Jan 2009
138 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#8

AW: Stream Lesefunktion aus XE7 funktioniert unter D2010 nicht korrekt

  Alt 17. Mai 2019, 06:04
So, wollte mal Rückmeldung geben:

Zitat:
Stream.ReadBuffer(AFieldRec.FontName[1], TextSize);
gefällt mir viiiieeeel besser, irgendwie war das Pointer-Handling für mich undurchsichtig...

Grund für die falsch gelesenen Inhalte war aber ein ganz anderer:
Da ist bei der Übernahme des Codes von XE7 glatt eine Zeile verloren gegangen:
Delphi-Quellcode:
      Stream.ReadBuffer(AFieldRec.TextColor, SizeOf(Integer));
      Stream.ReadBuffer(AFieldRec.TXFrame,SizeOf(TTXFrame)); <------- die fehlte
      Stream.ReadBuffer(TextSize, SizeOf(Integer));
      SetLength(AFieldRec.FontName, TextSize);
      Stream.ReadBuffer(Pointer(AFieldRec.FontName)^, TextSize);
und damit hat alles nachfolgende natürlich Murks gelesen!

Danke für Eure Unterstützung.

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