![]() |
TMemoryStream Größe Limit?
Hi,
habe mit Streams noch nicht so viel gearbeitet und nun habe ich ein Problem mit der Größe des Streams. Ich möchte mehrere Icons in einen Stream zusammen packen und dann per Indy Server/Client verschicken. Jetzt hätte ich versucht zuerst einen Stream vom einzelnen zu erzeugen. Dann in den Hauptstream reinschreiben:
Delphi-Quellcode:
Dann das Icon selbst
Hauptstream.Write(IconStream.Size, SizeOf(Int64))
Delphi-Quellcode:
Das geht super mit Icons die 1078 Bytes groß sind.
Hauptstream.Write(IconStream,IconStream.Size)
Dann habe ich aber auch versucht ein ~44kb Icon hinzu zu fügen und dann steigt Delphi voll aus. Auch wenn ich das große Icon als ersters reinlade kommt es zu einem Fehler. (Auf der Client Seite muss ich ja irgendwie die Icons wieder auseinander glauben) Habe ich da einen Fehler oder geht der Stream nicht größer? |
Re: TMemoryStream Größe Limit?
Du hast 'nen Fehler.
Der Stream geht maximal so groß, wie der größte zusammenhängende freie Speicherblok in deinem vituellen 2 GB-Speicherraum, oder schon früher, wenn dein physischer RAM samt Auslagerungsdatei voll ist. efektiv würde ich aber mit durchschnittlich maximal 0,75 GB rechnen |
Re: TMemoryStream Größe Limit?
Zitat:
|
Re: TMemoryStream Größe Limit?
Mit deiner letzten Anweisung schreibst du die Instanzenadresse + x Bytes in den Stream, nicht aber die Icon Daten selbst. x berechnet sich hierbei aus TIcon.Size - sizeof(TObject) (letzteres ergibt 4 Bytes, da es ein Pointer ist).
Schau dir mal die Methoden SaveToStream() und LoadFromStream() an. |
Re: TMemoryStream Größe Limit?
@Luckie:
Delphi-Quellcode:
IconStream klingt nach Stream, also nach Objektvariable :zwinker:
Hauptstream.Write(IconStream,IconStream.Size)
@schwa226: diese Variable ist 4 Byte ( SizeOf(TObject) ) groß. Was ist IconStream für ein Stream? bei TMemoryStream kommt man direkt an den Speicher und bei anderen Streams mußt du diesen erst in einen Puffer kopieren, bevor man den Inhalt an .Write übergeben. oder du nimmst eine andere Send-Methode, welche Streams versenden kann. Du hattest quasi nur Glück, daß alles, was über 4 Byte groß war, überhaupt "funktionierte". |
Re: TMemoryStream Größe Limit?
Zitat:
|
Re: TMemoryStream Größe Limit?
Das der restliche (geheime) Code fehlerfrei ist, habe ich nicht behauptet :angel2:
|
Re: TMemoryStream Größe Limit?
Der Code enthält die AlphSkin Control, deswegen habe ich ihn nicht gepostet:
Delphi-Quellcode:
ImgData ist ein TMemorystream.
var
i : Integer; IconsStream : TMemoryStream; SizeOfIcon : Int64; begin IconsStream := TMemoryStream.Create; //add all icons to stream: for i := 0 to sAlphaImageList.Count - 1 do begin SizeOfIcon := sAlphaImageList.Items[i].ImgData.Size; IconsStream.Write(SizeOfIcon,SizeOf(Int64)); IconsStream.Write(sAlphaImageList.Items[i].ImgData, SizeOfIcon); end; |
Re: TMemoryStream Größe Limit?
ImgData schein ein Object einer bestimmten Klasse zu sein, welche die Daten kapselt.
Da es ein Property Size gibt, wird es vermutlich auch ein Property geben, das auf die Adresse der eigentlichen Daten im Speicher verweist. Sollte dieses Property z.B. Memory heißen, dann etwa so:
Delphi-Quellcode:
IconsStream.Write(sAlphaImageList.Items[i].ImgData.Memory^, SizeOfIcon);
|
Re: TMemoryStream Größe Limit?
Liste der Anhänge anzeigen (Anzahl: 1)
Danke!
Ja es gibt Memory! Nun hier mein Test. Zuerst die Items alle in einem Stream Packen und dann wieder in eine neue Imagelist eintragen. Das geht nun schon ganz gut - Icons sind dann in der sAlphaImageList1. Jedoch verlieren die Icons durch den Transfer mit dem Stream ihre Transparenz!? Gibt es da noch was, was ich übersehen habe? Wenn ich in der sAlphaImageList1 ein Icon manuell einfüge und keines vom Stream hinzufüge ist es transparent. Wenn eines von dem Stream hizugefügt wird sind keine mehr transparent.
Delphi-Quellcode:
IconsStream := TMemoryStream.Create;
//add all icons to stream: for i := 0 to sAlphaImageList.Count - 1 do begin SizeOfIcon := sAlphaImageList.Items[i].ImgData.Size; IconsStream.Write(SizeOfIcon,SizeOf(Int64)); IconsStream.Write(sAlphaImageList.Items[i].ImgData.Memory^, SizeOfIcon); end; MyIcon := TIcon.Create; ReceivedIconStream := TMemoryStream.Create; TempStream := TMemoryStream.Create; ReceivedIconStream.LoadFromStream(IconsStream); FreeAndNil(IconsStream); ReceivedIconStream.Position := 0; //read all icons from stream: while ReceivedIconStream.Position < ReceivedIconStream.Size do begin ReceivedIconStream.Read(SizeOfIcon,SizeOf(Int64)); TempStream.SetSize(SizeOfIcon); TempStream.Position := 0; ReceivedIconStream.Read(TempStream.Memory^,SizeOfIcon); MyIcon.LoadFromStream(TempStream); sAlphaImageList1.AddIcon(MyIcon); end; FreeAndNil(MyIcon); FreeAndNil(ReceivedIconStream); FreeAndNil(TempStream); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:53 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