AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Großes Icon in Stream speichern
Thema durchsuchen
Ansicht
Themen-Optionen

Großes Icon in Stream speichern

Ein Thema von patti · begonnen am 16. Feb 2010 · letzter Beitrag vom 18. Feb 2010
Antwort Antwort
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
Benutzerbild von patti
patti

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

Re: Großes Icon in Stream speichern

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

Registriert seit: 2. Dez 2009
Ort: München
320 Beiträge
 
Lazarus
 
#3

Re: Großes Icon in Stream speichern

  Alt 17. Feb 2010, 20:05
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
Lanthan Astat
06810110811210410503210511511603209711003210010110 9032084097103
03211611111604403209711003210010110903210010510103 2108101116122
11610103209010110510810103206711110010103210511003 2068101108112
10410503210310111509910411410510109810111003211910 5114100046
  Mit Zitat antworten Zitat
Benutzerbild von patti
patti

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

Re: Großes Icon in Stream speichern

  Alt 18. Feb 2010, 10:35
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
Patrick Kreutzer
[Informatik-Student im 4. Semester]
http://www.patti-k.de/
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Großes Icon in Stream speichern

  Alt 18. Feb 2010, 10:50
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:
LLLLxxxxxxxxxxxxxxxxxxxLLLLyyyyyyyyyyyyyyyyyyyLLLLzzzzzzzzzzzzzzzzzz
Sind nun x,y & z immer nur Icons oder kann das auch etwas anderes sein?
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.
  Mit Zitat antworten Zitat
Benutzerbild von patti
patti

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

Re: Großes Icon in Stream speichern

  Alt 18. Feb 2010, 11:15
"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.
Angehängte Dateien
Dateityp: ico testicon_172.ico (264,1 KB, 7x aufgerufen)
Patrick Kreutzer
[Informatik-Student im 4. Semester]
http://www.patti-k.de/
  Mit Zitat antworten Zitat
Antwort Antwort


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 18:43 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