AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TMemoryStream Größe Limit?

Ein Thema von schwa226 · begonnen am 26. Nov 2009 · letzter Beitrag vom 26. Sep 2011
Antwort Antwort
Seite 1 von 2  1 2      
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#1

TMemoryStream Größe Limit?

  Alt 26. Nov 2009, 22:38
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:

Hauptstream.Write(IconStream.Size, SizeOf(Int64)) Dann das Icon selbst

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?
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#2

Re: TMemoryStream Größe Limit?

  Alt 26. Nov 2009, 22:58
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
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: TMemoryStream Größe Limit?

  Alt 26. Nov 2009, 22:59
Zitat von schwa226:
Habe ich da einen Fehler
Wie sollen wir das wissen ohne deinen Code zu kennen?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#4

Re: TMemoryStream Größe Limit?

  Alt 26. Nov 2009, 23:05
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#5

Re: TMemoryStream Größe Limit?

  Alt 26. Nov 2009, 23:07
@Luckie:
Hauptstream.Write(IconStream,IconStream.Size) IconStream klingt nach Stream, also nach Objektvariable

@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".
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: TMemoryStream Größe Limit?

  Alt 26. Nov 2009, 23:15
Zitat von himitsu:
@Luckie:
Hauptstream.Write(IconStream,IconStream.Size) IconStream klingt nach Stream, also nach Objektvariable
Deswegen kann sein vollständiger Code ja trotzdem Fehler enthalten.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#7

Re: TMemoryStream Größe Limit?

  Alt 26. Nov 2009, 23:20
Das der restliche (geheime) Code fehlerfrei ist, habe ich nicht behauptet
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#8

Re: TMemoryStream Größe Limit?

  Alt 27. Nov 2009, 09:20
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.
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#9

Re: TMemoryStream Größe Limit?

  Alt 27. Nov 2009, 09:58
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:
IconsStream.Write(sAlphaImageList.Items[i].ImgData.Memory^, SizeOfIcon);
  Mit Zitat antworten Zitat
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#10

Re: TMemoryStream Größe Limit?

  Alt 27. Nov 2009, 10:30
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);
Miniaturansicht angehängter Grafiken
untitled_446.png  
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:49 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