Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Stream als Rückgabewert einer Funktion (https://www.delphipraxis.net/23372-stream-als-rueckgabewert-einer-funktion.html)

Alibi 2. Jun 2004 00:11


Stream als Rückgabewert einer Funktion
 
Hi,
ich versuche hier gerade eine Funktion zu schreiben, die mir einen Stream zurückliefert, aber irgendwie will das hier nicht. Ich hab als vereinfachtes Beispiel, um andere Fehlerquellen auszuschließen das hier eben gemacht, aber selbst das will nicht:
Delphi-Quellcode:
function teststream: TMemoryStream;
var
  source: TFileStream;
  buf: array [0..1024] of char;
  numread: integer;
begin
  source := TFileStream.Create('add.bmp',fmOpenRead);
  numread := source.Read(buf, sizeof(buf));
  result := TMemoryStream.Create;
  result.WriteBuffer(buf, numread);
  source.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  bmp: TBitMap;
begin
  bmp := TBitMap.Create;
  bmp.LoadFromStream(teststream);
  bmp.SaveToFile('test.bmp');
  bmp.Free;
end;
Die test.bmp ist immer nur 0 Byte groß, wobei jedoch numread die exakte Anzahl der zu lesenden Bytes ist. add.bmp ist innerhalb der Buffergröße, also das ist egal.

phlux 2. Jun 2004 00:23

Re: Stream als Rückgabewert einer Funktion
 
mach doch aus der funktion ne prozedur und übergib ne variable dann dürfte das hinhauen ;) also so

Delphi-Quellcode:
procedure TestStream(var aStream: TMemoryStream)
begin
  //blablabla
end;
mfg phlux

Alibi 2. Jun 2004 00:49

Re: Stream als Rückgabewert einer Funktion
 
Wäre ne Idee. :) Trotzdem interessiert es mich doch schon, warum der oben gepostete Code nicht funktioniert.

Muetze1 2. Jun 2004 00:54

Re: Stream als Rückgabewert einer Funktion
 
Moin!

Dazu 2 Dinge:

1. Du übergibst den Rückgabewert (den Stream) direkt der LoadFromStream, somit wird dieser nicht freigeben -> Speicherleck.
2. Das Problem liegt darin, das WriteBuffer() die Daten in den Stream schreibt und danach ist der Positionszeiger des Streams am Ende des selbigen (Position = Size). Und LoadFromStream liest von der aktuellen Position im Stream ausgehen. Daher: Setze die Position des Zeigers auf 0 zurück nach dem WriteBuffer... (Position := 0 in der teststream vor'm End)

MfG
Muetze1

Alibi 2. Jun 2004 01:17

Re: Stream als Rückgabewert einer Funktion
 
Ah, klar, k, Brett vor dem Kopf gehabt. :) Danke.


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