Einzelnen Beitrag anzeigen

Benutzerbild von patti
patti

Registriert seit: 20. Okt 2004
Ort: Mittelfranken
665 Beiträge
 
Turbo Delphi für Win32
 
#1

Großes Icon in Stream speichern

  Alt 16. Feb 2010, 17:28
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:
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;
Hier treten dann Probleme auf:

Delphi-Quellcode:
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;
Habe außerdem herausgefunden, dass ich per Icon.LoadFromFile die gleiche Fehlermeldung bekomme, wenn die Icon-Datei nur das 256er Icon enthält.

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.
Patrick Kreutzer
[Informatik-Student im 4. Semester]
http://www.patti-k.de/
  Mit Zitat antworten Zitat