![]() |
VST: Massenweise verschiedene Icons schnell laden
Hi,
angenommen man möchte alle Dateien der Festplatte in einem Virtual String Tree (VST) darstellen. Dann kämen unglaublich viele verschiedene Icons zusammen. Wie könnte man das ohne den Speicher dauerhaft mit Icons zuzumüllen und mit möglichst kurzer Ladezeit lösen ? Jede Datei besitzt übrigens einen Node - Unternodes existieren also nicht. Mir geht es darum, wie man das am besten löst - die komplette Festplatte will ich nicht einladen, aber es geht mir einfach darum, das Maximum rauszuholen. |
Re: VST: Massenweise verschiedene Icons schnell laden
Moin Nils,
Zitat:
Je Dateityp kann es nur ein Icon sein. Ich habe mir die Icons mit Hilfe von SHGetFileInfo ausgelesen. Das zurückgegebene Handle habe ich dann als "Objekt" in einer TObjectList gespeichert, damit ich per IndexOf schnell prüfen kann, ob ich das Icon schon geladen habe. War es ein Neues Icon habe ich dieses dann per TIcon in einer ImageList gespeichert. |
Re: VST: Massenweise verschiedene Icons schnell laden
Es sind dennoch genug und ich möchte möglichst sparend arbeiten, je weniger Last desto besser.
Ich habe das eigentliche Zuweisen der Icons noch nicht eingebaut, es gibt nämlich den Fehler, es seien die Systemressourcen erschöüft. Warum ?
Delphi-Quellcode:
Icon := TIcon.Create;
GetExtIcon(Ext, Icon, False); if Icons.IndexOf(Icon) = -1 then Icons.Add(Icon); TreeData.fCaption := ExtractFileName(Directory+SR.Name); TreeData.fTyp := GetExtDes(Ext, False); AddVSTStructure(VST, nil, TreeData); |
Re: VST: Massenweise verschiedene Icons schnell laden
Moin Nils,
Zitat:
Delphi-Quellcode:
immer zutrifft, da Du mit jedem TIcon.Create eine neue Adresse bekommst, also wirklich jedes Icon speicherst.
if Icons.IndexOf(Icon) = -1 then
Deshalb speichere ich auch die Handles, die mir das System zurückliefert für den Vergleich. Die sind bei gleichem Icon auch gleich ;-) |
Re: VST: Massenweise verschiedene Icons schnell laden
unabhängig von Cristians Anmerkungen ist es auch so, dass du die Instanz des Icons nicht wieder frei gibst wenn es schon vorhanden ist.
Delphi-Quellcode:
Abers selbst wenn du dies tätest würde es dir nichts bringen, da die neue Instanz eh nicht in der Liste zu finden ist, auch wenn sie gleich aussehen. Aus diesem Grund auch Christians Hinweis auf die Handels.
if Icons.IndexOf(Icon) = -1 then
Icons.Add(Icon) else FreeAndNil(Icon); Gruß oki |
Re: VST: Massenweise verschiedene Icons schnell laden
Oh, das hätte ich wissen müssen. Und wie speicherst man Handles in Objektlisten ?
|
Re: VST: Massenweise verschiedene Icons schnell laden
Moin Nils,
Zitat:
|
Re: VST: Massenweise verschiedene Icons schnell laden
Warum soll es eigentlich eine TObjectList und keine TList sein?
|
Re: VST: Massenweise verschiedene Icons schnell laden
Zitat:
|
Re: VST: Massenweise verschiedene Icons schnell laden
Ich habe nun eine TList und leider auch noch die oben genannte Fehlermeldung. Die Funktion GetExtIcon existiert nun bei mir in zwei Varianten, die hier genutzte steht im zweiten Kasten. Icon ist daher als HICON deklariert.
Delphi-Quellcode:
GetExtIcon(Ext, Icon, False);
Index := Icons.IndexOf(@Icon); if Index = -1 then begin Icons.Add(@Icon); TreeData.fIcon := Pred(Icons.Count); end else TreeData.fIcon := Index;
Delphi-Quellcode:
function GetExtIcon(const Ext: String; var Icon: HICON; const FileMustExist: Boolean): Boolean;
var FI : TSHFileInfo; Attributes : DWORD; Flags : Word; begin if FileMustExist then begin Attributes := 0; Flags := SHGFI_ICON or SHGFI_SMALLICON; end else begin Attributes := FILE_ATTRIBUTE_NORMAL; Flags := SHGFI_USEFILEATTRIBUTES or SHGFI_ICON or SHGFI_SMALLICON; end; if SHGetFileInfo(PChar(Ext), Attributes, FI, SizeOf(FI), Flags) <> 0 then begin Icon := FI.hIcon; Result := True; end else Result := False; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:51 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