Skip to main content
devdelphi.ru

Back to all posts

Отображение содержимого фтп-сервера в TListView с ассоциированными иконками в системе

Published on
3 min read
Отображение содержимого фтп-сервера в TListView с ассоциированными иконками в системе image

При разработке файлового менеджера или любого приложения, которое взаимодействует с FTP-сервером, удобно отображать список файлов и папок на сервере в компоненте TListView. Но простое отображение названий файлов не всегда достаточно - пользователям привычнее видеть значки, как в проводнике Windows. В этой статье мы разберём, как:

  • подключиться к FTP-серверу;
  • получить список файлов;
  • отобразить их в TListView;
  • загрузить ассоциированные системные иконки для каждого типа файла.

Подключение к FTP-серверу

Для начала используем компонент IdFTP из библиотеки Indy. Пример базовой настройки:

IdFTP1.Host := 'ftp.example.com'; IdFTP1.Username := 'login'; IdFTP1.Password := 'password'; IdFTP1.Connect;

После подключения можно получить список файлов:

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:

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:

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-каталогов.