Entwickler-Ecke

Dateizugriff - Mehrere Icons in eine Datei Speichern und wieder auslesen


Stefan-W - Sa 03.09.05 17:11
Titel: Mehrere Icons in eine Datei Speichern und wieder auslesen
Hi,

Ich möchte um die ladezeiten meines Programms kleinzuhalten einen IconCash erstellen.
es handelt sich um bis zu 30 Icons die wie folgt angeordnet sind

(jedes XX steht für ein Icon)

Es können aber auch Icons dazwischen fehlen so das diese dann einfach leergelassen sind.

(zum nutzen der Icons: auf jedem Icon wird dann mit einer bestimmten Funktion reagiert. was auch geht nur ist das Programm beim Start zulangsam, weil erst die vielen Icon geladen werden müssen)

Nun zu meiner Frage:

Wie kann ich die Icons alle in einer Datei speichern UND wieder auslesen

Ich habs schon mit einer Bitmap versucht (nur leider bekomme ich da Probleme mit der Transparenz). ich hab auch schon an einen Stream gedacht nur leider hab ich da keinerlei Ahnung von und find auch nix brauchbares wie ich mehrere Bilder in und aus einer Datei bring bzw hohle.

ich würde mich über ein paar Lösungsvorschläge freuen.

Tschau


LigH - Sa 03.09.05 19:45

Eventuell möchtest du gern "Icon Libraries" (*.icl) unterstützen? -- Da habe ich bei Torry z.B. "IconTools v.2.01" gefunden (Freeware + Source, frei für nichtkommerzielle Nutzung).


Lannes - Sa 03.09.05 23:20
Titel: Re: Mehrere Icons in eine Datei Speichern und wieder auslese
Hallo,
user profile iconStefan-W hat folgendes geschrieben:
...Ich hab auch schon an einen Stream gedacht nur leider hab ich da keinerlei Ahnung von und find auch nix brauchbares wie ich mehrere Bilder in und aus einer Datei bring bzw hohle...


mal ein einfaches Beispiel ohne Try usw.:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure TForm1.IcosSpeichern;
var Stream : TStream;
begin
  Stream := TFileStream.Create('C:\Temp\sammel.icons',fmCreate);
  Image1.Picture.LoadFromFile('C:\Temp\google.ico');
  Image1.Picture.Icon.SaveToStream(Stream);
  Image1.Picture.LoadFromFile('C:\Temp\gmx.ico');
  Image1.Picture.Icon.SaveToStream(Stream);
  //... weitere
  Stream.Free;
end;

procedure TForm1.IcosLaden;
var Stream : TStream;
begin
  Stream := TFileStream.Create('C:\Temp\sammel.icons',fmOpenRead);
  Image2.Picture.Icon.LoadFromStream(stream);
  Stream.Position := 878;//Größe der Datei 'google.ico';
  Image3.Picture.Icon.LoadFromStream(stream);
  //... weitere
  Stream.Free;
end;


Stefan-W - So 04.09.05 13:05

erstmal Danke für die Vorschläge die ihr mir gemacht habt.

Ich hab nun am ende doch einen Stream genommen, nur hab ich nicht die Icons einzeln gespeichert sondern eine Array die die Icons enthält... da ich diese Intern sowieso verwende. das macht die arbeit mit dem Stream sehr viel kürzer :D

und dank user profile iconLannes hab ich das mit dem Stream sehr schnell begriffen.oder zumindest das was ich gebraucht hab ;-)

nochmal Danke euch beiden

Tschau


Stefan-W - So 04.09.05 13:33

hi,hi :D
war ich mit meinen Tests mal wieder weng zuschnell :D war ja klar :oops:

jedenfalls gibt es keine Probleme solang ich das Programm zwischendurch nicht beende ... (sehr toll nichtwar) ... aber ich denk ich schaffs nun auchnoch das doch die Icons einzeln (wie oben vorgeschlagen wurde) in die Datei kommen


Stefan-W - So 04.09.05 14:26

kann mir mal nochmal jemand das mit dem laden aus einem Stream erklähren?

das so wie oben steht bringt kein ergebnis (nichtmal ein Fehler)


Lannes - So 04.09.05 14:33

Hallo,

bei mir läuft der Code, wird kein Icon angezeigt?
Sind die Icon-Größen angegeben? wenn nicht müsste eine Fehlermeldung kommen.


Stefan-W - So 04.09.05 14:42

bei mir klappt nichtmal das:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
Procedure TForm1.Button1Click(Sender: TObject);
Var
    I, J, K: Integer;
    Len: Longint;
    Stream: TFileStream;
Begin
        Stream := TFileStream.Create(ExePfad.Arbeitsverzeichnis + '1.dat', fmCreate);
  Image1.Picture.Icon.SaveToStream(Stream);
  Stream.Free;
End;

Procedure TForm1.Button2Click(Sender: TObject);
Var
  I, J, K: Integer;
  Len: Longint;
  Stream: TFileStream;
Begin
  Stream := TFileStream.Create(ExePfad.Arbeitsverzeichnis + '1.dat', fmOpenRead);
  I_Button1.Picture.Icon.LoadFromStream(Stream);
  Stream.Free;
End;

keine Fehlermeldung nix
es scheint zwar gespeichert (Button1) worden zu sein
aber das laden ausm Stream geht nich (Button2)


Stefan-W - So 04.09.05 14:51

ah gut... ich hatte was vergessen auszukomentieren.

jetzt zeigt er mir was an.

nur leider hat das nicht mehr das aussehen wie vorher. (vorher 32Bit farben jetzt 16 farben)


Stefan-W - So 04.09.05 15:44

Kann ich delphi vorschreiben was für ein Icon (welche Qualität) es in den Stream schreibt?
(weil es die einfachste qualität in die Stream schreibt)


Lannes - So 04.09.05 23:57

Hallo,

hab in dem Code zum Speichern der Icons in eine Datei, den Umweg über die Image, durch die Nutzung eines MemoryStreams ersetzt.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure IcosSpeichern;
var Stream : TStream;
    ms : TMemoryStream;
begin
  Stream := TFileStream.Create('C:\Temp\sammel.icons',fmCreate);
  ms := TMemoryStream.Create;
  ms.LoadFromFile('C:\Temp\google.ico');
  showmessage(IntToStr(ms.Size));//Dateigröße anzeigen
  ms.SaveToStream(Stream);
  ms.Clear;
  ms.LoadFromFile('C:\Temp\gmx.ico');
  showmessage(IntToStr(ms.Size));
  ms.SaveToStream(Stream);  //... weitere
  ms.Free;
  Stream.Free;
end;

Damit dürfte die Qualität der Icons unverändert bleiben, es werden ja nur Bytes zusammengesetzt.


Stefan-W - Mo 05.09.05 20:27

gtu danke :-) ich werds nochmal testen :D

mein Vater wird sich freuen da er bis jetzt mit einer version leben muss die nicht so super aussieht


Stefan-W - Mi 07.09.05 17:37

hi, also ich kann das nicht ganz so machen wie du oben (da das icon meist in einer EX, DLL oder ICL ist) und damit meine Versuche gescheitert sind. ich glaub ich bekomm das mit dem Stream und den Bildern nicht aus die Reihe... (allerdings hab ich gelernd dass man damit wunderbar daten speichern kann wie Strings etc...)

Ich werde das Problem auf eine Andere weise lösen und doch wieder eine Bitmap speichern allerdings werde ich den Hintergrung (der mir die Schwierigkeiten gemacht hat) mit hineinschreiben/malen und nicht wecklassen wie ich es eigentlich bis jetzt hatte.

Nochmal vielen dank für eure Vorschläge und deine Unterstützung mir dem Code Lannes.

Tschau


Sinspin - Mi 07.09.05 18:57

hi,

wenn ich das ganze jetzt richtig verstanden habe dann hast du eine menge von icons die du in einem programm verwenden willst? sind die icons lose? also jedes in seiner datei oder noch irgendwo gebunden?
dürfen die icons fest in das program gebunden sein das sie verwendet?
wenn ja kann ich dir nur empfehlen sie über die komponente TImageList fest einzubinden.
falls das nicht der fall ist kannst du doch einfach ein verzeichnis verwenden in das du alle icons reinpackst und das mit der exe ausgeliefert wird. oder du fasst alle zu einem archive zusammen. der nötige zipper/unzipper ist ja bei delphi dabei.


Stefan-W - Mi 07.09.05 19:07

ich arbeite an einem Schnellstart-Programm welches dann eine Liste mit den selbst gewählten Programmen anzeigt.

und das anzeigen der vielen Icons zu den einzelnen Programmen ist etwas langsam, also speichere ich die Icons alle in einer Datei dann muss ich nur die eine laden und nicht die Icons jedes mal aus den (bis zu 30) Programmpfaden einzeln holen

1 Bitmap ist wesendlich schneller geladen als die Daten die ich zum suchen der 30 Icons brauch aus der Ini zu holen und dann noch die Icons selber zu laden.

{
ich stell demnächst noch eine Version Online siehe später mal: "T-Run"
eine ältere Versin des Programmes (welche noch unter dem Namen: "Mausmenü [http://www.delphi-forum.de/viewtopic.php?t=26028&start=0&postdays=0&postorder=asc&highlight=]" läuft findest du auch hier im Forum
}


Sinspin - Mi 07.09.05 19:21

ist ja echt interessant, nur sehe ich unter win nicht so ganz den sinn dessen. unter DOS habe ich sowas auch mal gebaut weil mir der batchsalat auf den senkel gegangen ist.
du holst dir also die icons zusammen und speicherst sie als ein bitmap? gute idee! das farbenproblem hast du behoben bekommen? ansonsten, wieviele farben ein bitmap haben kann lässt sich ja auch erzwingen. TBitmap.pixelFormat - pf32Bit,...


Stefan-W - Mi 07.09.05 19:25

ich hab nun den Hintergrund mit gespeichert. dadurch ist der Fehler (der komischerweise nur unter XP entstanden ist) weck :D