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?