Приветствую всех читателей блога. Совсем недавно делал мини-программу по получению информации из фтп-сервера, то есть. Другими словами простенький фтп-клиент. Я не буду здесь рассказывать, как сделать полноценный фтп-клиент, я расскажу, как использовать компонент TListView для отображения информации фтп-сервера. Причем информация будет отображаться с иконками, ассоциируемые в Вашей системе Windows.
Скажу сразу, тот пример, который будем рассматривать мы в данной статье, основан на компоненте TidFTP из вкладки Indy Clients, но смысл остается тем же, если Вы будете использовать компонент, например библиотеки Synapse.
На форме у меня компонент TListView, в свойстве ViewStyle у меня выставлен vsReport, либо же можно vsIcon. У меня рабочий проект выглядит следующим образом (свойство ViewStyle=vsReport):
Свойство ViewStyle=vsIcon:
Все довольно красиво и понятно. Теперь давайте приступим к реализации. Будем разбираться по частям. У меня объявлена переменная:
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.
Метки: ftp, idFTP, Indy, Indy Clients, ListView, TListView, иконки, ФТП