![]() |
Großes Icon in Stream speichern
Hi,
hab im Moment so meine Schwierigkeiten, ein großes Icon (speziell geht es im Moment um die Auflösung 256x256) in einen Stream zu speichern und wieder daraus zu lesen. Bei kleineren Icons (getestet bis 48x48) funktioniert meine Methode einwandfrei, jedoch bei höheren Auflösungen scheint es wie gesagt Probleme zu geben. Wenn ich mir ein großes Icon besorge und erstmal auf eine Canvas zeichne, dann scheint alles zu funktionieren. Das Icon wird richtig dargestellt und es gibt keine Probleme. Nur nach dem Speichern und Lesen kann ich das Icon nicht mehr verwenden, als Error bekomme ich ein EOutOfRessources bzw. "Falscher Parameter". Hier mal Ausschnitte aus meinem Quelltext:
Delphi-Quellcode:
Hier treten dann Probleme auf:
procedure WriteIconToStream(var AStream : TStream; AIcon : TIcon);
var ms : TMemoryStream; var s : integer; begin //-- ms := TMemoryStream.Create; // try ms.Seek(0,soFromBeginning); AIcon.SaveToStream(ms); s := ms.Size; AStream.Write(s, SizeOf(s)); ms.SaveToStream(AStream); finally ms.Free; end; end; procedure ReadIconFromStream(var AStream : TStream; var AIcon : TIcon); var ms : TMemoryStream; var s : integer; begin //-- AStream.Read(s, SizeOf(s)); // ms := TMemoryStream.Create; // try ms.Seek(0,soFromBeginning); ms.CopyFrom(AStream, s); ms.Seek(0,soFromBeginning); AIcon.LoadFromStream(ms); finally ms.Free; end; end;
Delphi-Quellcode:
Habe außerdem herausgefunden, dass ich per Icon.LoadFromFile die gleiche Fehlermeldung bekomme, wenn die Icon-Datei nur das 256er Icon enthält.
var hIcon : TIcon;
var ms : TStream; begin //-- hIcon:= TIcon.Create; // try // Icon besorgen... klappt einwandfrei // Self.Repaint; // ms := TMemoryStream.Create; // try WriteIconToStream(ms,hIcon); ms.Seek(0,soBeginning); ReadIconFromStream(ms,hIcon); // self.Canvas.Draw(150, 150, hIcon); // <-- Nach der Fehlermeldung steht der Cursor in dieser Zeile finally ms.Free; end; finally hIcon.Free; end; Entweder stehe ich im Moment völlig auf dem Schlauch und das Problem ist total einfach lösbar - oder aber es handelt es sich um ein grundsätzliches Problem der Icon-Klasse oder so. Hoffe daher auf Hilfe von euch. Danke schonmal. |
Re: Großes Icon in Stream speichern
Nach ca. 24 Stunden mal ein vorischtiger *Push*.
Hat jemand eine Idee, wie ich ein großes Icon fehlerfrei in einen Stream speichern und wieder daraus laden kann? Im Moment gehe ich davon aus, dass in der Icon-Klasse ein Fehler steckt, da es ja mit kleineren Icons funktioniert und der Error "EOutOfRessources" nur bei den großen Icons kommt. |
Re: Großes Icon in Stream speichern
Hallo patti, anbei dein abgeänderter Code. Sieh dir nochmal in aller Ruhe deinen geposteten Code durch,
da ist einiges nicht ganz korrekt. Solltest du dann noch fragen haben, meld dich wieder.
Delphi-Quellcode:
function WriteIconToStream(AIcon: TIcon): TStream; begin Result := TMemoryStream.Create; AIcon.SaveToStream(Result); AIcon.Free; AIcon := nil; end; function ReadIconFromStream(AStream: TStream): TIcon; begin AStream.Seek(0, 0); Result := TIcon.Create; Result.LoadFromStream(AStream); AStream.Free; AStream := nil; end; var AIcon: TIcon; AStream: TStream; begin AIcon := TIcon.Create; AIcon.LoadFromFile('C:\test.ico'); AStream := WriteIconToStream(AIcon); AIcon := ReadIconFromStream(AStream); self.Canvas.Draw(150, 150, AIcon); end. lg. Astat |
Re: Großes Icon in Stream speichern
Hi Astat,
erstmal danke für deine Antwort. Leider trifft das mein Problem nicht genau. Hätte in meinem ersten Post vermutlich noch verdeutlichen sollen, dass ich eigentlich mehrere Icons (zusammen mit anderen Daten) in einen Stream speichern will. Der letzte Quelltext-Ausschnitt oben war nur ein Beispiel, in Wirklichkeit sollen wie gesagt mehrere Daten hintereinander geschrieben werden. Dein Quelltext schreibt bzw. liest ja jeweils nur ein Icon in den / aus dem Stream. Sorry, hab mich da wohl etwas falsch ausgedrückt. Trotzdem danke nochmal für deine Bemühungen ;-) mfg |
Re: Großes Icon in Stream speichern
Du solltest vielleicht deine Icons hochladen.
In deinem Stream kommt zuerst die Länge und danach die Nutzdaten (das Icon). Dein Gesamtstream sieht ungefähr so aus (L=Länge, x,y,&z=Nutzdaten):
Code:
Sind nun x,y & z immer nur Icons oder kann das auch etwas anderes sein?
LLLLxxxxxxxxxxxxxxxxxxxLLLLyyyyyyyyyyyyyyyyyyyLLLLzzzzzzzzzzzzzzzzzz
Falls es auch andere Daten sind, dann sollte zusätzlich zur Längenangabe auch eine Datentypangabe im Stream vorhanden sein. Ansonsten; hast du mal versucht den MemoryStream innerhalb procedure ReadIconFromStream wieder in eine Datei zu speichern? Und dann einen Binärvergleich mit der orginalen Icondatei durchführen. |
Re: Großes Icon in Stream speichern
Liste der Anhänge anzeigen (Anzahl: 1)
"x, y & z" sind verschiedene Daten (Icons, Strings, ...). Mein Stream ist genauso aufgebaut, wie du es beschrieben hast. Auf die Datentypangabe kann ich in meinem Fall jedoch verzichten, da ich immer weiß, welche Daten als nächstes im Stream kommen müssen. Es handelt sich um eine ObjectList mit Objekten einer Klasse, die sich alle nacheinander in den Stream speichern, wobei jeder Speicher- bzw. Lese-Vorgang aller Objekte exakt gleich abläuft.
Bin inzwischen der Meinung, dass das Problem in der Icon-Klasse liegt. Hab mit einem Icon-Editor ein Icon erstellt, welches nur die Auflösung 256x256 enthält. Wenn ich dieses mit Icon.LoadFromFile versuche zu öffnen und auf die Canvas meiner Form zeichnen will, erhalte ich exakt die gleiche Fehlermeldung wie oben beschrieben. Hab das Icon mal in den Anhang, vielleicht kann das ja mal jemand testen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:57 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