Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TMemoryStream -> Speicherwillkür?! (https://www.delphipraxis.net/92745-tmemorystream-speicherwillkuer.html)

trashcandesign 25. Mai 2007 09:36


TMemoryStream -> Speicherwillkür?!
 
Irgendwie komm ich mit dem befüllen eines TMemoryStreams nicht klar.

Folgende Prozedur:

Delphi-Quellcode:
procedure FillStream(AStream: TMemoryStream);
var
  TestStream : TMemoryStream;
  TestString : string;
begin
 TestStream := TMemoryStream.Create;
 TestString := 'TEST';

 TestStream.Write(TestString, Length(TestString));
end;
Klappt anscheinend, aber sobald ich am Ende der Prozedur der Variablen AStream TestStream zuweisen möchte:

Delphi-Quellcode:
  AStream := TestStream
oder direkt AStream füllen lassen will

Delphi-Quellcode:
  AStream.Write(TestSTring, Length(TestString));
schreibt er mir nix rein?!

s03 25. Mai 2007 10:01

Re: TMemoryStream -> Speicherwillkür?!
 
Hallo,

probiere es mit:
Delphi-Quellcode:
TestStream.Write(TestString[1], Length(TestString));

Codewalker 25. Mai 2007 10:06

Re: TMemoryStream -> Speicherwillkür?!
 
Hm, weiß nicht ob es nötig ist, aber versuch doch mal:

Delphi-Quellcode:
TestStream.Seek(0,soFromBeginning);
bevor du die Zuweisung machst.

trashcandesign 25. Mai 2007 10:19

Re: TMemoryStream -> Speicherwillkür?!
 
Funktioniert leider beides nicht.

Was ich merkwürdig finde ist, dass bei:

Delphi-Quellcode:
function TMPConnection.MakeConnectionStream: TMemoryStream;
var
  TestStream : TMemoryStream;
  TestString : string;
begin
TestStream := TMemoryStream.Create;
Result     := TMemoryStream.Create;
TestString := 'TEST';
TestStream.Seek(0,soFromBeginning);
TestStream.Write(TestString, Length(TestString));

Result.Seek(0,soFromBeginning);
 Result.Write(TestString, Length(TestString));
end;
TestStream anscheind gefüllt wird, währen Result leer bleibt :gruebel:

s03 25. Mai 2007 10:40

Re: TMemoryStream -> Speicherwillkür?!
 
Ich weiß es nicht, aber dies funktioniert bei mir wunderbar:
Delphi-Quellcode:
procedure TfrmHauptBaseForm.Button1Click(Sender: TObject);
var
  ms:TMemoryStream;
  str:string;
begin
  str:='Test';
  ms:=TMemoryStream.Create;
  ms.Write(str[1],Length(str));
  ms.SaveToFile('c:\tst.txt');
  ms.Free;
end;
Mann muss unbeding die Adresse des ersten Zeichens (str[1]) übergeben und nicht die Adresse des Strings.

Dezipaitor 25. Mai 2007 12:06

Re: TMemoryStream -> Speicherwillkür?!
 
Dein Problem liegt in

Delphi-Quellcode:
procedure FillStream(AStream: TMemoryStream);
wenn du

Delphi-Quellcode:
AStream := TestStream;
machst, dann passiert nichts, denn der Parameter wird als Wert übergeben und eine Änderung des Parameters
bleibt nur in der Prozedur erhalten. Genauer gesagt, der Parameter AStream wird kopiert, und du änderst einfach nur
die lokale Variable.

Versuch mal
Delphi-Quellcode:
procedure FillStream(var AStream: TMemoryStream);
Ich würde dir jedoch empfehlen, innerhalb von FillStream keinen Stream zu erzeugen, sondern
dem Aufrufer dies zu überlassen. Dann kannst du nämlich Daten an beliebiger Stelle in einem Stream speichern.


Delphi-Quellcode:


procedure FillStream(AStream: TMemoryStream);
var
  TestString : string;
begin
  if not Assigned(AStream) then
    exit; //oder raise exception
TestString := 'TEST';


AStream.Write(TestString[1], Length(TestString));
end;

var TestStream : TMemoryStream;
begin
  TestStream := TMemoryStream.Create;
....
  //hier z.B. weitere Daten schreiben

  FillStream(AStream);


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