Wie erstelle ich eine Dateiliste mit den registrierten Icons und Dateibeschreibungen?


Folgendes Beispiel demonstriert, wie ein TListView mit den Dateiennamen aus einem beliebigen Verzeichnis, sowie mit den dafür registrierten Icons und Dateibeschreibungen gefüllt wird:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComCtrls, ShellAPI, StdCtrls, FileCtrl;

type
  TMainForm = class(TForm)
    ListView: TListView;
    DirectoryListBox: TDirectoryListBox;
    procedure FormCreate(Sender: TObject);
    procedure DirectoryListBoxChange(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  MainForm    : TMainForm;
  LargeImages : TImageList;
  SmallImages : TImageList;

implementation

{$R *.DFM}

procedure Createimages;
var SysIL : uint;
    SFI : TSHFileInfo;
begin
  LargeImages := TImageList.Create(MainForm);
  SysIL := SHGetFileInfo('', 0, SFI, SizeOf(SFI), SHGFI_SYSICONINDEX or SHGFI_LARGEICON);
  if SysIL<>0 then begin
    LargeImages.Handle := SysIL;
    LargeImages.ShareImages := True;
  end;
  SmallImages := TImageList.Create(MainForm);
  SysIL := SHGetFileInfo('', 0, SFI, SizeOf(SFI), SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
  if SysIL<>0 then begin
    SmallImages.Handle := SysIL;
    SmallImages.ShareImages := True;
  end;
  MainForm.ListView.LargeImages := LargeImages;
  MainForm.ListView.SmallImages := SmallImages;
end;

function NamenSortProc(Item1, Item2: TListItem; ParamSort: integer): integer; stdcall;
var T1,T2 : string;
begin
  T1 := Item1.Caption;
  if Item1.ImageIndex=3 then
    T1 := '_'+T1;
  T2 := Item2.Caption;
  if Item2.ImageIndex=3 then
    T2 := '_'+T2;
  Result := lstrcmp(PChar(T1),PChar(T2))
end;

procedure VerzeichnisEinlesen(VerzName:string);
var NewItem : TListItem;
    Info : TSHFileInfo;
    SR : TSearchRec;
begin
  if VerzName[length(VerzName)]<>'\' then
    VerzName := VerzName+'\';
  with MainForm do begin
    ListView.Items.Clear;
    if FindFirst(VerzName+'*.*',faAnyFile,SR)=0 then begin
      NewItem:=ListView.Items.Add;
      NewItem.Caption := SR.Name;
      SHGetFileInfo(PChar(VerzName+SR.Name),0,Info,SizeOf(TSHFileInfo),SHGFI_SYSIconIndex or SHGFI_TYPENAME);
      NewItem.ImageIndex := Info.IIcon;
      NewItem.SubItems.Add(Info.szTypeName);
      while FindNext(SR)=0 do begin
        NewItem:=ListView.Items.Add;
        NewItem.Caption := SR.Name;
        SHGetFileInfo(PChar(VerzName+SR.Name),0,Info,SizeOf(TSHFileInfo),SHGFI_SYSIconIndex or SHGFI_TYPENAME);
        NewItem.ImageIndex := Info.IIcon;
        NewItem.SubItems.Add(Info.szTypeName);
      end;
    end;
    FindClose(SR);
    ListView.CustomSort(@NamenSortProc, 0);
  end;
end;

procedure TMainForm.DirectoryListBoxChange(Sender: TObject);
begin
  VerzeichnisEinlesen(DirectoryListBox.Directory);
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  CreateImages;
  VerzeichnisEinlesen(DirectoryListBox.Directory);
end;

end.
Delphi 1 Delphi 2 Delphi 3 Delphi 4
nicht getestet Version nicht betroffen getestet

siehe auch:

Wie ermittelt man das mit einem Dateityp verknüpfte Programm?


Delphi FAQ