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

2 минуты на чтение

При разработке файлового менеджера или любого приложения, которое взаимодействует с 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-каталогов.



Facebook Vk Ok Twitter LinkedIn Telegram

Похожие записи:

TListView в Delphi - это компонент визуального интерфейса пользователя, который позволяет отображать и управлять списком элементов. Он может использоваться для отображения информации в виде таблицы или списка элементов, таких как файлы в папке, контакты в адре...
TListView - это компонент визуального программирования, используемый в рамках различных интегрированных сред разработки (IDE), таких как Delphi или C++ Builder.
Серверы в игре Майнкрафт – это компьютеры или хостинг-платформы, которые позволяют игрокам объединяться и играть вместе в одну и ту же игру. Они предоставляют возможность создавать и настраивать виртуальные миры, где игроки могут взаимодействовать между собой....