Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi TMemoryStream Größe Limit? (https://www.delphipraxis.net/143955-tmemorystream-groesse-limit.html)

schwa226 26. Nov 2009 21:38


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:
Hauptstream.Write(IconStream.Size, SizeOf(Int64))
Dann das Icon selbst

Delphi-Quellcode:
Hauptstream.Write(IconStream,IconStream.Size)
Das geht super mit Icons die 1078 Bytes groß sind.
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?

himitsu 26. Nov 2009 21:58

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

Luckie 26. Nov 2009 21:59

Re: TMemoryStream Größe Limit?
 
Zitat:

Zitat von schwa226
Habe ich da einen Fehler

Wie sollen wir das wissen ohne deinen Code zu kennen? :roll:

Muetze1 26. Nov 2009 22:05

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.

himitsu 26. Nov 2009 22:07

Re: TMemoryStream Größe Limit?
 
@Luckie:
Delphi-Quellcode:
Hauptstream.Write(IconStream,IconStream.Size)
IconStream klingt nach Stream, also nach Objektvariable :zwinker:

@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".

Luckie 26. Nov 2009 22:15

Re: TMemoryStream Größe Limit?
 
Zitat:

Zitat von himitsu
@Luckie:
Delphi-Quellcode:
Hauptstream.Write(IconStream,IconStream.Size)
IconStream klingt nach Stream, also nach Objektvariable :zwinker:

Deswegen kann sein vollständiger Code ja trotzdem Fehler enthalten.

himitsu 26. Nov 2009 22:20

Re: TMemoryStream Größe Limit?
 
Das der restliche (geheime) Code fehlerfrei ist, habe ich nicht behauptet :angel2:

schwa226 27. Nov 2009 08:20

Re: TMemoryStream Größe Limit?
 
Der Code enthält die AlphSkin Control, deswegen habe ich ihn nicht gepostet:

Delphi-Quellcode:
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;
ImgData ist ein TMemorystream.

Blup 27. Nov 2009 08:58

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);

schwa226 27. Nov 2009 09:30

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 17:23 Uhr.
Seite 1 von 2  1 2      

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