![]() |
Systemicons und Listview
Hi!
Mal wieder ne Frage meinerseits [wie könnts nur ander sein :mrgreen:] Ich möchte zu meinen Dateien die in einer Listview angezeigt werden, die dzgh. Icons auflisten lassen. ![]() Wenn ich das aber so übernehme wie das oben im Tut geschrieben steht, führt der immer nur ein einziges Icon auf und fügt es jedem einzelnen Eintrag hinzu. Warum? Muss man einen anderen Pfad bei WindowsXp angeben damit das funzt? |
Re: Systemicons und Listview
Ich weiß nicht welchen Pfad du meinst, du suchst ja immer nur nach Dateien, zu denen du die Icons hinzufügen willst. Hast du den Code per Copy&Waste übernommen? So wie der aussieht müsste er funktionieren.
|
Re: Systemicons und Listview
Jo, habsch 8) [siehe Ahpha *räusper*]
|
Re: Systemicons und Listview
Dir ist klar: Listbox <> Listview?
|
Re: Systemicons und Listview
?
Sollte doch auch auf eine Listview anzuwenden sein oder nicht? |
Re: Systemicons und Listview
nicht auch, sondern nur
Listbox kann nicht vsIcon, vsReport und diese Sachen. |
Re: Systemicons und Listview
Ach so, sorry, ich meine natürlich Listview, nicht Listbox, Schreibfehler [korrigiert]!!!
:wall: |
Re: Systemicons und Listview
Nichts gegen die Schweizer, aber das Beispiel scheint mir ein wenig ... äh ... na, sagen wir: wenig ressourcen-schonend. Die Systemicons werden von Windows durch eine spezielle System-Imageliste zur Verfügung gestellt, an die man rankommen kann.
Das momentane Problem scheint mir zu sein, dass für jede gefundene Datei das Icon ermittelt und in die eigene Imageliste eingetragen wird. Ich habe den Code jetzt nicht 100% analysiert, aber gäbe es bspw. zwei BAT-Dateien, dann würde die Imageliste 2x das gleiche Symbol enthalten. Ich denke, da kommt man günstiger weg, wenn man besagte System-Imageliste holt und dann nur noch den Index für das jeweilige Icon ermittelt und zuweist. Wie das geht, zeigt u.a. der List-View-Beitrag in den viel gerühmten ![]() Das Wissen lässt sich IMHO auch problemlos auf die VCL übertragen. ;) |
Re: Systemicons und Listview
öhm...
Da stehen bestimmt viele interessante Sachen drin aber ich hab erstmal Schwierigkeiten durch die Grundlagen durchzusteigen... Gibts da nicht was einfacheres= |
Re: Systemicons und Listview
Na ja, evtl. sehe ich das mehr aus dem Blickwinkel des etwas fortgeschritteneren Anwenders. Ich persönlich finde es nicht allzu schwer.
1. Also, du pappst 2 Imagelisten auf deine Form, lässt sie aber komplett leer. Eine nennst du "ilSmall", die andere "ilBig". Und enorm wichtig!: Stell bei beiden im Objektinspektor die Eigenschaft "ShareImages" auf TRUE. 2. Im "OnCreate"-Ereignis deiner Form machst du folgendes:
Delphi-Quellcode:
3. Jetzt kannst du die Dateien auslesen und mit ihrem Symbol anzeigen lassen. Ich habe das auf die Schnelle via Button-Klick und nicht rekursiv machen lassen. Aber es geht ja auch nur um´s Prinzip:
procedure TForm1.FormCreate(Sender: TObject);
var hImgSm, hImgBig : HIMAGELIST; fi : TSHFileInfo; begin // Imageliste mit kleinen Symbolen ermitteln hImgSm := HIMAGELIST(SHGetFileInfo('',0,fi,sizeof(fi), SHGFI_SYSICONINDEX or SHGFI_SMALLICON)); // und an die Imageliste auf der Form übergeben if(hImgSm <> 0) then ilSmall.Handle := hImgSm; // Imageliste mit großen Symbolen ermitteln hImgBig := HIMAGELIST(SHGetFileInfo('',0,fi,sizeof(fi), SHGFI_SYSICONINDEX or SHGFI_ICON)); // und an die Imageliste auf der Form übergeben if(hImgBig <> 0) then ilBig.Handle := hImgBig; end;
Delphi-Quellcode:
Fertig. ;)
procedure TForm1.Button1Click(Sender: TObject);
var ds : TSearchRec; res : integer; li : TListItem; fi : TSHFileInfo; begin res := FindFirst('c:\*.*',faAnyFile,ds); while(res = 0) do begin if(ds.Attr and faDirectory = 0) and (ds.Name <> '.') and (ds.Name <> '..') then begin // Name der Datei eintragen li := Listview1.Items.Add; li.Caption := ds.Name; // jetzt Zugriff auf die System-Imageliste // und nur den Typennamen und das Symbol // ermitteln! ZeroMemory(@fi,sizeof(fi)); SHGetFileInfo(pchar('c:\' + ds.Name),0,fi,sizeof(fi), SHGFI_ICON or SHGFI_SYSICONINDEX or SHGFI_TYPENAME); // Icon-Index zuweisen, ... li.ImageIndex := fi.iIcon; // "iIcon" ist eine Integer-Variable und erhält somit // wirklich nur den Index auf das Symbol, aber nicht // das Symbol als solches. Daher ist es nun egal, wie // oft ein Dateityp im Ordner vorkommt. // ... & Typennamen als Untereintrag hinzufügen li.SubItems.Add(fi.szTypeName); end; res := FindNext(ds); end; FindClose(ds); end; PS: Wird zwar auch in den Tutorials erwähnt, aber der Vollständigkeit halber: Gib die Imagelisten auf der Form bitte NICHT frei!. Sonst sind evtl. deine Symbole im Explorer weg. :mrgreen: Ein Neustart behebt das Problem. Allerdings dürfen die Imagelisten in dem Fall eben nicht freigegeben werden. Sie werden ja auch nicht in deinem Programm erzeugt sondern vom System zur Verfügung gestellt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:29 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 by Thomas Breitkreuz