Список файлов В каталоге В TListView
Вопрос
Я создаю программу, которая должна на Form_Create
, заполнить TListView
вызванный FileList
, каталог , который я хочу заполнить , находится там , где находится скомпилированная программа + \Files
, поскольку я никогда не использовал TListView
Я хочу знать, как это сделать?
Решение
Ваш вопрос состоит из нескольких частей.Я предоставлю Обзор вот.Если вам нужна помощь по какому-либо конкретному шагу, пожалуйста, отправьте более конкретный последующий вопрос.
Определите, к чему относится фраза "где находится скомпилированная программа".
Чтобы получить полный путь к исполняемому файлу, вызовите
ParamStr(0)
.Чтобы удалить имя EXE-файла из этой строки, чтобы у вас была только часть каталога, вызовитеExtractFilePath
.Убедитесь , что оно заканчивается обратной косой чертой (IncludeTrailingPathDelimiter
) а затем добавьте свой каталог "Files".Получите список файлов.
Использование
FindFirst
иFindNext
чтобы создать цикл, который просматривает все файлы.Имена будут включать "." и ".." относительные имена каталогов, поэтому вы можете исключить их.Обратите внимание, что файлы не перечислены в каком-либо определенном порядке.Например, если вам нужно, чтобы они были отсортированы в алфавитном порядке, вам нужно будет сделать это самостоятельно.(Они могут появиться чтобы в ваших тестах все было в алфавитном порядке, но это не всегда будет правдой.)var Rec: TSearchRec; begin if FindFirst(path + '\*', faAnyFile, Rec) = 0 then try repeat if (Rec.Name = '.') or (Rec.Name = '..') then continue; if (Rec.Attr and faVolumeID) = faVolumeID then continue; // nothing useful to do with volume IDs if (Rec.Attr and faHidden) = faHidden then continue; // honor the OS "hidden" setting if (Rec.Attr and faDirectory) = faDirectory then ; // This is a directory. Might want to do something special. DoSomethingWithFile(Rec.Name); until FindNext(Rec) <> 0; finally SysUtils.FindClose(Rec); end; end;
Добавьте узлы к элементу управления для представления файлов.
Возможно, вы захотите сделать это в гипотетическом
DoSomethingWithFile
функция, о которой я упоминал выше.Используйте представление списка вItems
свойство выполнять какие-либо действия с элементами, например добавлять новые.var Item: TListItem; begin Item := ListView.Items.Add; Item.Caption := FileName; end;
TListItem
обладает дополнительными свойствами;подробности см. в документации.ВSubItems
свойство полезно, если вы показываете представление списка в режиме "отчет", где для одного узла может быть несколько столбцов.Свяжите изображения с элементами.
Изображения узлов в виде списка берутся из связанных списков изображений,
LargeImages
иSmallImages
.Они относятся к одному или несколькимTImageList
компоненты в вашей форме.Поместите туда свои изображения значков, а затем назначьте элементы 'ImageIndex
свойства к соответствующим номерам.
В зависимости от того, насколько сложной вы хотите сделать свою программу, вы можете захотеть использовать Delphi TShellListView
контролируйте, вместо того чтобы выполнять всю вышеперечисленную работу самостоятельно.
Другие советы
Если вы добавляете TImageList в форму с двумя изображениями (одно для файлов и одно для каталогов), а затем присваиваете TImageList свойству TListviews LargeImages, вы можете использовать приведенный ниже код.
procedure TForm2.Button1Click(Sender: TObject);
var li:TListItem;
SR: TSearchRec;
begin
FileList.Items.BeginUpdate;
try
FileList.Items.Clear;
FindFirst(ExtractFilePath(Application.ExeName) +'*.*', faAnyFile, SR);
try
repeat
li := FileList.Items.Add;
li.Caption := SR.Name;
if ((SR.Attr and faDirectory) <> 0) then li.ImageIndex := 1
else li.ImageIndex := 0;
until (FindNext(SR) <> 0);
finally
FindClose(SR);
end;
finally
FileList.Items.EndUpdate;
end;
end;
Затем вы можете использовать это, добавив разные изображения в TImageList для разных типов файлов и используя ExtractFileExt(SR.Name), чтобы получить расширение файлов
if ((SR.Attr and faDirectory) <> 0) then li.ImageIndex := 1
else if lowercase(ExtractFileExt(SR.Name)) = '.png' then li.ImageIndex := 2
else if lowercase(ExtractFileExt(SR.Name)) = '.pdf' then li.ImageIndex := 3
else li.ImageIndex := 0;
Вам нужно будет показывать изображения при рисовании строк.
Это должно навести вас на мысль:http://www.delphidabbler.com/articles?article=16 http://delphi.about.com/od/delphitips2008/qt/lv_checkbox_bmp.htm
Единственное отличие заключается в том, что вы будете рисовать иконку / изображение.Здесь вы узнаете, как это сделать в сетке: http://delphi.about.com/library/weekly/aa032205a.htm Таким образом, из обоих вы можете почерпнуть идею.