Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi VST: Massenweise verschiedene Icons schnell laden (https://www.delphipraxis.net/115190-vst-massenweise-verschiedene-icons-schnell-laden.html)

Nils_13 7. Jun 2008 17:16


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.

Christian Seehase 7. Jun 2008 17:30

Re: VST: Massenweise verschiedene Icons schnell laden
 
Moin Nils,

Zitat:

Zitat von Nils_13
Dann kämen unglaublich viele verschiedene Icons zusammen.

das kann ich mir eigentlich nicht vorstellen.
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.

Nils_13 7. Jun 2008 17:44

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);

Christian Seehase 7. Jun 2008 18:05

Re: VST: Massenweise verschiedene Icons schnell laden
 
Moin Nils,

Zitat:

Zitat von Nils_13
es gibt nämlich den Fehler, es seien die Systemressourcen erschöüft. Warum ?

Weil das hier:

Delphi-Quellcode:
if Icons.IndexOf(Icon) = -1 then
immer zutrifft, da Du mit jedem TIcon.Create eine neue Adresse bekommst, also wirklich jedes Icon speicherst.

Deshalb speichere ich auch die Handles, die mir das System zurückliefert für den Vergleich.
Die sind bei gleichem Icon auch gleich ;-)

oki 7. Jun 2008 18:12

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:
if Icons.IndexOf(Icon) = -1 then
  Icons.Add(Icon)
else
  FreeAndNil(Icon);
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.

Gruß oki

Nils_13 7. Jun 2008 18:14

Re: VST: Massenweise verschiedene Icons schnell laden
 
Oh, das hätte ich wissen müssen. Und wie speicherst man Handles in Objektlisten ?

Christian Seehase 7. Jun 2008 18:16

Re: VST: Massenweise verschiedene Icons schnell laden
 
Moin Nils,

Zitat:

Zitat von Nils_13
Oh, das hätte ich wissen müssen. Und wie speicherst man Handles in Objektlisten ?

mittels TypeCast auf TObject.

Apollonius 7. Jun 2008 18:17

Re: VST: Massenweise verschiedene Icons schnell laden
 
Warum soll es eigentlich eine TObjectList und keine TList sein?

Christian Seehase 7. Jun 2008 18:21

Re: VST: Massenweise verschiedene Icons schnell laden
 
Zitat:

Zitat von Apollonius
Warum soll es eigentlich eine TObjectList und keine TList sein?

Gewohnheit :stupid:

Nils_13 7. Jun 2008 19:04

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.
Seite 1 von 2  1 2      

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