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

Метки: , , , , , , ,

Оставить комментарий

Вы можете использовать следующие теги:

*