Удобнее всего воспользоваться компонентом ListView. Его используют многие программы, так как он позволяет очень просто создать удобный список.
Вначале создадим ImageList и с помощью функции WinAPI SHGetFileInfo заполним его иконками, связанными со всеми зарегистрированными расширениями. Затем, при выборе пользователем в DirectoryListBox каталога, найдем все файлы в этом каталоге и для каждого определим иконку при помощи той же функции SHGetFileInfo. И еще к каждому элементу списка добавляется размер файла. Если вывести список в виде таблицы (для этого нужно выбрать пункт Table в ComboBox), то справа от имени каждого файла окажется его размер.
uses
ShellAPI;
procedure
UpdateFiles;
var
sr: TSearchRec;
li: TListItem;
fi: TSHFileInfo;
ext:
string
;
IconIndex:
word
;
ic: TIcon;
begin
Form1
.
ListView1
.
Items
.
BeginUpdate;
Form1
.
ListView1
.
Items
.
Clear;
if
FindFirst(Form1
.
DirectoryListBox1
.
Directory +
'\*.*'
, faAnyFile, sr) =
0
then
repeat
if
sr
.
Attr
and
faDirectory <>
0
then
continue;
li := Form1
.
ListView1
.
Items
.
Add;
li
.
Caption := sr
.
name;
ext := LowerCase(ExtractFileExt(li
.
Caption));
ShGetFileInfo(
PChar
(
'*'
+ ext),
0
, fi, SizeOf(fi),
SHGFI_SMALLICON
or
SHGFI_SYSICONINDEX
or
SHGFI_TYPENAME);
li
.
ImageIndex := fi
.
iIcon;
if
sr
.
Size <
1024
then
li
.
SubItems
.
Add(IntToStr(sr
.
Size) +
' byte'
)
else
if
sr
.
Size <
1024
*
1024
then
li
.
SubItems
.
Add(IntToStr(round(sr
.
Size /
1024
)) +
' KByte'
)
else
li
.
SubItems
.
Add(IntToStr(round(sr
.
Size / (
1024
*
1024
))) +
' MByte'
);
li
.
SubItems
.
Add(fi
.
szTypeName);
until
FindNext(sr) <>
0
;
FindClose(sr);
Form1
.
ListView1
.
Items
.
EndUpdate;
end
;
procedure
TForm1
.
FormCreate(Sender: TObject);
var
fi: TSHFileInfo;
lc: TListColumn;
begin
DriveComboBox1
.
DirList := DirectoryListBox1;
with
ListView1
do
begin
SmallImages := TImageList
.
CreateSize(
16
,
16
);
SmallImages
.
Handle := ShGetFileInfo(
'*.*'
,
0
, fi,
SizeOf(fi), SHGFI_SMALLICON
or
SHGFI_ICON
or
SHGFI_SYSICONINDEX);
LargeImages := TImageList
.
Create(
nil
);
LargeImages
.
Handle := ShGetFileInfo(
'*.*'
,
0
, fi,
SizeOf(fi), SHGFI_LARGEICON
or
SHGFI_ICON
or
SHGFI_SYSICONINDEX);
lc := Columns
.
Add;
lc
.
Caption :=
'Name'
;
lc := Columns
.
Add;
lc
.
Caption :=
'Size'
;
ComboBox1
.
Items
.
Add(
'Icons'
);
ComboBox1
.
Items
.
Add(
'List'
);
ComboBox1
.
Items
.
Add(
'Table'
);
ComboBox1
.
Items
.
Add(
'SmallIcons'
);
ComboBox1
.
ItemIndex :=
0
;
end
;
UpdateFiles;
end
;
procedure
TForm1
.
DirectoryListBox1Change(Sender: TObject);
begin
UpdateFiles;
end
;
procedure
TForm1
.
ComboBox1Click(Sender: TObject);
begin
case
ComboBox1
.
ItemIndex
of
0
: ListView1
.
ViewStyle := vsIcon;
1
: ListView1
.
ViewStyle := vsList;
2
: ListView1
.
ViewStyle := vsReport;
else
ListView1
.
ViewStyle := vsSmallIcon;
end
;
end
;