При разработке файлового менеджера или любого приложения, которое взаимодействует с FTP-сервером, удобно отображать список файлов и папок на сервере в компоненте TListView
. Но простое отображение названий файлов не всегда достаточно — пользователям привычнее видеть значки, как в проводнике Windows. В этой статье мы разберём, как:
- подключиться к FTP-серверу;
- получить список файлов;
- отобразить их в
TListView
; - загрузить ассоциированные системные иконки для каждого типа файла.
Подключение к FTP-серверу
Для начала используем компонент IdFTP
из библиотеки Indy. Пример базовой настройки:
1 2 3 4 |
IdFTP1.Host := 'ftp.example.com'; IdFTP1.Username := 'login'; IdFTP1.Password := 'password'; IdFTP1.Connect; |
После подключения можно получить список файлов:
1 2 3 4 5 6 7 8 9 |
var i: Integer; begin IdFTP1.List(nil, '', False); // Получить список for i := 0 to IdFTP1.DirectoryListing.Count - 1 do begin Memo1.Lines.Add(IdFTP1.DirectoryListing.Items[i].FileName); end; end; |
Добавление TListView
Разместите компонент TListView
на форму и установите свойство ViewStyle
в vsReport
или vsIcon
, в зависимости от предпочтений отображения.
Получение системных иконок
Чтобы получить ассоциированные иконки для каждого файла, воспользуемся API-функцией SHGetFileInfo
.
Создадим TImageList
(например, SystemIcons
) и свяжем его с ListView.SmallImages
.
Пример функции, которая возвращает индекс иконки в ImageList
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
uses ShellAPI, CommCtrl; function GetIconIndex(const FileName: string; ImageList: TImageList): Integer; var shinfo: SHFILEINFO; hIcon: HICON; Icon: TIcon; begin FillChar(shinfo, SizeOf(shinfo), 0); SHGetFileInfo(PChar(FileName), 0, shinfo, SizeOf(shinfo), SHGFI_ICON or SHGFI_SMALLICON or SHGFI_USEFILEATTRIBUTES); hIcon := shinfo.hIcon; Icon := TIcon.Create; try Icon.Handle := hIcon; Result := ImageList.AddIcon(Icon); finally DestroyIcon(hIcon); Icon.Free; end; end; |
Отображение в TListView
Теперь, когда есть список файлов и способ получить иконки, отобразим всё это в ListView
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
procedure ShowFtpFilesInListView; var i, iconIndex: Integer; fileName: string; item: TListItem; begin ListView1.Items.BeginUpdate; try ListView1.Items.Clear; for i := 0 to IdFTP1.DirectoryListing.Count - 1 do begin fileName := IdFTP1.DirectoryListing[i].FileName; iconIndex := GetIconIndex(fileName, ImageList1); item := ListView1.Items.Add; item.Caption := fileName; item.ImageIndex := iconIndex; end; finally ListView1.Items.EndUpdate; end; end; |
Особенности
- Для папок можно задавать расширение вручную (например, ".folder"), чтобы получить нужную иконку.
- Используйте
SHGFI_USEFILEATTRIBUTES
с атрибутомFILE_ATTRIBUTE_NORMAL
для файлов иFILE_ATTRIBUTE_DIRECTORY
для папок. - Для избежания дубликатов иконок можно кэшировать уже добавленные расширения с индексами.
Заключение
Добавление системных иконок в TListView
значительно повышает удобство работы пользователя с FTP-файлами. Это визуально приближает поведение вашего приложения к привычному интерфейсу Windows Explorer. Надеемся, что данный пример поможет вам в реализации функционала просмотра FTP-каталогов.