Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi JPEG + StringList -> Stream (https://www.delphipraxis.net/78092-jpeg-stringlist-stream.html)

RobertP 28. Sep 2006 21:12


JPEG + StringList -> Stream
 
Moin,
ich möchte ein JPEG und eine Stringlist in eine Datei speichern. Dass ich Bild und Text später wieder trennen kann schreib ich erstmal die Länge vom datstream(enthält StringList). Dann schreib ich nacheinander beide Streams. Wenn ich das ganze nun ausführe kommt aber bei der Zeile (unten markiert) ein Stream Read Error. Was mach ich falsch?

Delphi-Quellcode:
  datstream := TMemoryStream.Create;
  gfxstream := TMemoryStream.Create;

  jpg.SaveToStream(gfxstream);
   
  list.SaveToStream(datstream);
 


  Stream := TFileStream.Create(apppath + 'test2.ekq', fmCreate);

  Len := sizeof(datstream);
  Stream.Write(Len, SizeOf(Len));


  Stream.CopyFrom(datstream, sizeof(datstream)); // <<<<<<<--------- Stream Read Error
  Stream.CopyFrom(gfxstream, sizeof(gfxstream));


  Stream.Free;
  datstream.Free;
  gfxstream.Free;

SirThornberry 28. Sep 2006 21:23

Re: JPEG + StringList -> Stream
 
Delphi-Quellcode:
sizeof(DataStream)
wird dir immer 4 zurück geben da eine Objectinstanz ein Pointer ist. Zudem hast du die Position des Streams nicht auf den Anfang zurück gesetzt.

RobertP 29. Sep 2006 14:13

Re: JPEG + StringList -> Stream
 
Ok des mit dem SizeOf hab ich in Stream.Size geändert nu gehts. Das Auslesen funktioniert allerdings immernoch nicht... Ich bekomm jedesmal einen StreamReadError :gruebel:

Delphi-Quellcode:
  datstream := TMemoryStream.Create;
  gfxstream := TMemoryStream.Create;

  Stream := TFileStream.Create(apppath + 'test2.ekq', fmOpenRead);

  Stream.Position := 0;

  Stream.Read(Len, SizeOf(Len));
  datstream.CopyFrom(Stream, Len);
  gfxstream.CopyFrom(Stream, Stream.Size);

  datstream.Position := 0;
  gfxstream.Position := 0;

  mapImage.Bitmap.LoadFromStream(gfxstream);
  list := TStringList.Create;
  list.LoadFromStream(datstream);

  Stream.Free;
  datstream.Free;
  gfxstream.Free;

Muetze1 29. Sep 2006 14:21

Re: JPEG + StringList -> Stream
 
Zitat:

Zitat von MrPayne
Delphi-Quellcode:
  datstream := TMemoryStream.Create;
  gfxstream := TMemoryStream.Create;

  Stream := TFileStream.Create(apppath + 'test2.ekq', fmOpenRead);

  Stream.Position := 0;

  Stream.Read(Len, SizeOf(Len));
  datstream.CopyFrom(Stream, Len);
  gfxstream.CopyFrom(Stream, Stream.Size); // <--- !!!

  datstream.Position := 0;
  gfxstream.Position := 0;

  mapImage.Bitmap.LoadFromStream(gfxstream);
  list := TStringList.Create;
  list.LoadFromStream(datstream);

  Stream.Free;
  datstream.Free;
  gfxstream.Free;

Wenn du mit Len schon aus Stream den DatStream rauskopierst, dann wird Stream.Size wohl etwas gross sein für gfxStream, oder? schliesslich wurden schon Len-Anzahl von Bytes ausgelesen und gehören definitiv nicht zum Bild.

RobertP 29. Sep 2006 15:16

Re: JPEG + StringList -> Stream
 
Achso ich hab gedacht des 2. Argument bei CopyFrom gibt die EndPosition an...

Hab die entsprechende Zeile nun so geändert:
Delphi-Quellcode:
gfxstream.CopyFrom(Stream, Stream.Size-Len-SizeOf(Len));
Jetzt gehts Danke!


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