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

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

Приветствую всех читателей блога. Совсем недавно делал мини-программу по получению информации из фтп-сервера, то есть. Другими словами простенький фтп-клиент. Я не буду здесь рассказывать, как сделать полноценный фтп-клиент, я расскажу, как использовать компонент TListView для отображения информации фтп-сервера. Причем информация будет отображаться с иконками, ассоциируемые в Вашей системе Windows.

Скажу сразу, тот пример, который будем рассматривать мы в данной статье, основан на компоненте TidFTP из вкладки Indy Clients, но смысл остается тем же, если Вы будете использовать компонент, например библиотеки Synapse.

На форме у меня компонент TListView, в свойстве ViewStyle у меня выставлен vsReport, либо же можно vsIcon. У меня рабочий проект выглядит следующим образом (свойство ViewStyle=vsReport):

ФТП-клиент Delphi

ФТП-клиент Delphi

Свойство ViewStyle=vsIcon:

ФТП-клиент на Delphi

ФТП-клиент на Delphi

Все довольно красиво и понятно. Теперь давайте приступим к реализации. Будем разбираться по частям. У меня объявлена переменная:

var
 LS:TStringList;

При помощи кода:

IdFTP1.ChangeDir(DirName); 
 IdFTP1.List(LS,'',True);

Я получаю сожержимое текущей директории на фтп и помещаю в переменную LS. Теперь имена папок и файлов текущей директории на фтп, у меня хранятся в переменной LS. Далее я запускаю цикл:

for i:=0 to LS.Count-1 do
   begin
    ListFTPString:=LS.Strings[i];
    ListView2.AddItem(NameFTPFiles,MainForm);
     if IdFTP1.DirectoryListing.Items[i].ItemType=ditFile then
      attr:=0
     else
      attr:=FILE_ATTRIBUTE_DIRECTORY;
    if Ini.ReadString('main','viewstyle','')='vsReport' then
     h:=SHGetFileInfo(PChar(LS.Strings[i]), attr, si, SizeOf(si),SHGFI_ICON or SHGFI_SMALLICON or SHGFI_SYSICONINDEX or SHGFI_USEFILEATTRIBUTES)
    else
     h:=SHGetFileInfo(PChar(LS.Strings[i]), attr, si, SizeOf(si),SHGFI_ICON or SHGFI_LARGEICON or SHGFI_SYSICONINDEX or SHGFI_USEFILEATTRIBUTES);
    ImageList1.ShareImages:=True;
    ImageList1.Handle:=h;
    ListView2.Items[ListView2.Items.Count-1].ImageIndex:=si.iIcon;
end;

Давайте теперь  немного разбираться. Начнем с переменных:

Var
 h:DWORD;
  si:SHFILEINFO;
  attr:Cardinal;

С типами думаю все понятно. Мы проходимся по всему списку наших файлов и папок, что мы получили на фтп-сервере и проверяем папка это или файл, если папка, то присваиваем иконку папки, если файл, то иконку файла ассоциированного в системе.

Причем я сделал проверку, какое свойство ViewStyle у меня установлено, такой размер иконок я указываю при помощи функции SHGetFileInfo с соответствующими параметрами.

Подобным образом Вы можете задавать абсолютно любую иконку для элемента в TListView, но цель наша выполнена: мы сделали довольно полноценный фтп-клиент, который мы в видим в том же самом Total Commander.

В данном проекте я также сделал скчивание файлов (открытие папок), а также поиск информации по фтп-серверу (в текущей директории).  Поиск происходит, грубо говорят в самом компоненте TListView.

Если Вас интересуют еще какие-то вопросы по данной теме, то задавайте, я постараюсь все изложить на листке бумаги. Но думаю, что проблем с обычным фтп-клиентом не будет ни у кого, ведь в сети огромное количество примеров как на Synapse так и на Indy.

Facebook Vk Ok LinkedIn Telegram

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

Здравствуйте, в этой статье опять хотелось бы поговорить о преобразовании графических форматов. На данный момент хотел бы поговорить о форматах ico и bmp. Мы уже преобразовывали bmp в jpeg и различные метафайлы, на сей раз будет работать с «иконками». Немного поговорим о самом фо...
Здравствуйте, в этой статье хотел бы рассказать как можно отобразить картинки в дереве рядом с узлами. Наверняка многие делали все возможные каталоги или применяли «деревья» в своих приложениях, где необходимо было именно размещать картинки, а например при раскрытии роди...
Итак, в свое время я делал для себя программу, которая должна была считывать текущие настройки сети и показывать их в программе. Далее, я мог эти настройки сохранить в файл, кроме этого, я мог ввести настройки сети (TCP/IP — ip-адрес, маску, dns-сервера) вручную и также добавить (со...