AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TMemoryStream.ReadBuffer

Ein Thema von dmitrienko · begonnen am 26. Jul 2024 · letzter Beitrag vom 26. Jul 2024
Antwort Antwort
dmitrienko

Registriert seit: 26. Jul 2024
3 Beiträge
 
#1

TMemoryStream.ReadBuffer

  Alt 26. Jul 2024, 11:46
Folgender Code funktioniert nicht richtig. Ich versuche eine JPG aus TImage in TMemoryStream zu speichern, um danach den Inhalt des TMemoryStreams in ein Feld vom Typ TBytes zu packen. Die JPG scheint im TMemoryStream intakt, aber nach dem einlesen in TBytes-Feld kommt nur Daten-Müll raus, das heißt anstelle der JPG kommt nur 0x00 raus. Wenn ich ReadBuffer benutze, dann kommt die Meldung "Stream Lesefehler". Wenn ich Read benutze, dann kommt keine Meldung, dafür aber wird in TBytes-Feld Müll reingeschrieben.

Dieses Problem tritt sowohl bei Delphi 11.3 Community Edition, als auch bei Delphi 12.1 Trial Edition auf. Hier ist der Link zu dem Code:
Delphi-Quellcode:
var
  a_FileName: String;
begin
  if (Assigned(ImageOfTheDay.Picture.Graphic)) then
  begin
    ImageOfTheDay.Picture.SaveToStream(fMemoryStream);
    a_FileName := ExtractFilePath(fFileName) + 'test0.jpg';
    fMemoryStream.SaveToFile(a_FileName); // die jpg, die rauskommt, ist intakt
    SetLength(fBytes, fMemoryStream.Size);
    if (Length(fBytes) > 0) then
      fMemoryStream.Read(fBytes[0], Length(fBytes)); // hier wird Müll ins TBytes-Feld reingeschrieben
      // fMemoryStream.ReadBuffer(fBytes[0], Length(fBytes));
      // bei readbuffer trit stream lesefehler auf, bei einfachem read kommt kein fehler auf
    fMemorystream.Clear;
    if (Length(fBytes) > 0) then
    begin
      fMemoryStream.WriteBuffer(fBytes, Length(fBytes));
      a_FileName := ExtractFilePath(fFileName) + 'test1.jpg'; // die jpg, die rauskommt, ist kaputt
      fMemoryStream.SaveToFile(a_FileName);
      fMemorystream.Clear;
    end;
  end;
end;

Geändert von TBx (31. Jul 2024 um 06:12 Uhr) Grund: Delphi-Tags eingefügt
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
880 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: TMemoryStream.ReadBuffer

  Alt 26. Jul 2024, 11:52
Hallo und willkommen in der Delphi-Praxis!

Was liefert denn fMemoryStream.Read(fBytes[0], Length(fBytes)); zurück, d.h. wie viele Bytes werden tatsächlich gelesen?

Funktioniert es, wenn du die Position im Stream vor dem Lesen auf 0 zurücksetzt?
fMemoryStream.Position := 0
The angels have the phone box.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.623 Beiträge
 
Delphi 12 Athens
 
#3

AW: TMemoryStream.ReadBuffer

  Alt 26. Jul 2024, 12:01
Das "Zurückspulen" des Streams ist tatsächlich nötig, gerade ausprobiert.

@TE: Herzlich Willkommen in der DP. Bitte benutz künftig für Delphi-Code auch die Delphi-Tags, entweder über die "Helm"-Schaltfläche im Beitragseditor oder indem Du den Code in [ delphi ] und [ /delphi ] (ohne die Leerzeichen) einschließt.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: TMemoryStream.ReadBuffer

  Alt 26. Jul 2024, 12:31
// hier wird Müll ins TBytes-Feld reingeschrieben
Oder wohl eher "nichts"

// bei readbuffer trit stream lesefehler auf, bei einfachem read kommt kein fehler auf
Ja, das war aber auch richtig, da eben nichts, bzw. nicht genug gelesen werden konnte.
Beim Read mußt du die Rückgabe (Result) prüfen
und das ReadBuffer prüft es selbst (wirft bei Fehler eine Exception).

Und wo kommt das fMemoryStream überhaupt her?
Nicht dass da vorher schon was drin liegt und der Pointer ebenfalls sonstwo steht.

Also eventuell auch noch ein fMemoryStream.Clear; vor dem Picture.SaveToStream(fMemoryStream) .


Warum ist das fMemorystream überhaupt eine globale Variable, wenn es doch "eigentlich" (am Ende ein Clear) nur lokal genutzt wird?
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
dmitrienko

Registriert seit: 26. Jul 2024
3 Beiträge
 
#5

AW: TMemoryStream.ReadBuffer

  Alt 26. Jul 2024, 12:44
FMemoryStream.Read liefert die Größe der JPG, das in fBytes reingeschrieben wurde.

Das mit fMemoryStream.Position := 0 vor fMemoryStream.ReadBuffer war die Lösung.

Also vielen Dank, Leute! Es funzt!
  Mit Zitat antworten Zitat
dmitrienko

Registriert seit: 26. Jul 2024
3 Beiträge
 
#6

AW: TMemoryStream.ReadBuffer

  Alt 26. Jul 2024, 12:45
Habe fMemoryStream auf lokale a_MemoryStream umgestellt.

Danke für den Hinweis.
  Mit Zitat antworten Zitat
Antwort Antwort


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 05:44 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