Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   TStream als Teil an einen anderen TStream übergeben (https://www.delphipraxis.net/157803-tstream-als-teil-einen-anderen-tstream-uebergeben.html)

amigage 25. Jan 2011 17:22

TStream als Teil an einen anderen TStream übergeben
 
Hallo,

ich glaube ich steht auf dem Schlauch und hoffe, ihr könnt mir helfen.
Folgende Problemstellung: Ich möchte eien Grafik einlesen und deren Inhalt mit zusätzlichen Informationen versehen und in einer Binärdatei speichern.

Folgender Ansatz:
Delphi-Quellcode:
var
  FileStream : TFileStream;
  PicStream, MyStream: TStream;
  Len : integer;
begin
  // :
  // Größe des Streams
  Len := PicStream.Size;
  MyStream.Write(Len, SizeOf(Len));
  MyStream.Write(PicStream, Len);
  // :
  // und dann als Datei speichern
  FileStream := TFileStream.Create('D:\Temp\test.dat', fmCreate);
  MyStream.Position := 0;
  try
    FileStream.CopyFrom(MyStream, MyStream.Size);
  finally
    FileStream.Free;
  end;
end;
Beim Auslesen gehe ich so vor:

Delphi-Quellcode:
 
var
  FileStream : TFileStream;
  PicStream : TMemoryStream;

  sizeInt : integer;
  TempBuff : String;
begin    
  // :
  sizeInt := 0;
  FileStream.Read(sizeInt, SizeOf(integer));
  If sizeInt > 0 then
  begin
    SetLength(TempBuff, sizeInt);
    FileStream.Read(PChar(TempBuff)^, sizeInt);

    PicStream.Clear;
    PicStream.Write(PChar(TempBuff)^, Length(TempBuff));
    PicStream.Position := 0;
  end;
  // :
end;
Aber irgendwie stimmen die Daten des Streams nicht. An was kann es hängen? Ist schon das Speichern falsch?

Es wäre schön, wenn mich jemand auf die richtige Fährte führen würde :?

Besten Dank.

himitsu 25. Jan 2011 18:01

AW: TStream als Teil an einen anderen TStream übergeben
 
Delphi-Quellcode:
MyStream.Write(PicStream, Len);
speichert den Objekt-Zeiger und nicht den Stream-Inhalt. :warn:
Warum nicht einfach CopyFrom, bzw. warum nicht direkt in den FileStream?


String = Unicode, seit Delphi 2009
Unicode = 2 Byte pro Zeichen
du speicherst und ließt aber nur 1 Byte pro Zeichen ... heißt also zu vergißt die Hälft.

Delphi-Quellcode:
Bytes = Length(S) * SizeOf(Char)
für Delphi-Referenz durchsuchenString
Aber in deinem Fall einfach AnsiString oder besser och RawByteString verwenden.

amigage 26. Jan 2011 13:41

AW: TStream als Teil an einen anderen TStream übergeben
 
Hallo,

dank Deiner Tipps habe ich es nun zum Laufen bekommen und kann die Daten wie gewünscht schreiben und lesen.

:thumb:


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