Thema: Delphi Systemicons und Listview

Einzelnen Beitrag anzeigen

MathiasSimmack
(Gast)

n/a Beiträge
 

Re: Systemicons und Listview

  Alt 9. Mai 2004, 17:55
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:
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;
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:
Delphi-Quellcode:
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;
Fertig.


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. 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.
  Mit Zitat antworten Zitat