![]() |
TMemoryStream -> Speicherwillkür?!
Irgendwie komm ich mit dem befüllen eines TMemoryStreams nicht klar.
Folgende Prozedur:
Delphi-Quellcode:
Klappt anscheinend, aber sobald ich am Ende der Prozedur der Variablen AStream TestStream zuweisen möchte:
procedure FillStream(AStream: TMemoryStream);
var TestStream : TMemoryStream; TestString : string; begin TestStream := TMemoryStream.Create; TestString := 'TEST'; TestStream.Write(TestString, Length(TestString)); end;
Delphi-Quellcode:
oder direkt AStream füllen lassen will
AStream := TestStream
Delphi-Quellcode:
schreibt er mir nix rein?!
AStream.Write(TestSTring, Length(TestString));
|
Re: TMemoryStream -> Speicherwillkür?!
Hallo,
probiere es mit:
Delphi-Quellcode:
TestStream.Write(TestString[1], Length(TestString));
|
Re: TMemoryStream -> Speicherwillkür?!
Hm, weiß nicht ob es nötig ist, aber versuch doch mal:
Delphi-Quellcode:
bevor du die Zuweisung machst.
TestStream.Seek(0,soFromBeginning);
|
Re: TMemoryStream -> Speicherwillkür?!
Funktioniert leider beides nicht.
Was ich merkwürdig finde ist, dass bei:
Delphi-Quellcode:
TestStream anscheind gefüllt wird, währen Result leer bleibt :gruebel:
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; |
Re: TMemoryStream -> Speicherwillkür?!
Ich weiß es nicht, aber dies funktioniert bei mir wunderbar:
Delphi-Quellcode:
Mann muss unbeding die Adresse des ersten Zeichens (str[1]) übergeben und nicht die Adresse des Strings.
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; |
Re: TMemoryStream -> Speicherwillkür?!
Dein Problem liegt in
Delphi-Quellcode:
wenn du
procedure FillStream(AStream: TMemoryStream);
Delphi-Quellcode:
machst, dann passiert nichts, denn der Parameter wird als Wert übergeben und eine Änderung des Parameters
AStream := TestStream;
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:
Ich würde dir jedoch empfehlen, innerhalb von FillStream keinen Stream zu erzeugen, sondern
procedure FillStream(var AStream: TMemoryStream);
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