![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Здравствуйте, форумчане!
Вопрос банальный : нужно вывести в ListView список файлов с иконками из определённой директории с возможностью запуска (аналог эксплорера). В поисках ответа я облазил весь инет, на всех сайтах одна и та же статья, к сожалению не рабочая ![]() Заранее большое спасибо! А вот собственно и эта статья : Код:
Удобнее всего воспользоваться компонентом ListView. Его используют многие программы, так как он позволяет очень просто создать удобный список. Вначале создадим ImageList и с помощью функции WinAPI SHGetFileInfo заполним его иконками, связанными со всеми зарегистрированными расширениями. Затем, при выборе пользователем в DirectoryListBox каталога, найдем все файлы в этом каталоге и для каждого определим иконку при помощи той же функции SHGetFileInfo. И еще к каждому элементу списка добавляется размер файла. Если вывести список в виде таблицы (для этого нужно выбрать пункт Table в ComboBox), то справа от имени каждого файла окажется его размер. uses ShellAPI; procedure UpdateFiles; var sr: TSearchRec; li: TListItem; fi: TSHFileInfo; ext: string; IconIndex: word; ic: TIcon; begin Form1.ListView1.Items.BeginUpdate; Form1.ListView1.Items.Clear; if FindFirst(Form1.DirectoryListBox1.Directory + '\*.*', faAnyFile, sr) = 0 then repeat if sr.Attr and faDirectory <> 0 then continue; li := Form1.ListView1.Items.Add; li.Caption := sr.name; ext := LowerCase(ExtractFileExt(li.Caption)); ShGetFileInfo(PChar('*' + ext), 0, fi, SizeOf(fi), SHGFI_SMALLICON or SHGFI_SYSICONINDEX or SHGFI_TYPENAME); li.ImageIndex := fi.iIcon; if sr.Size < 1024 then li.SubItems.Add(IntToStr(sr.Size) + ' byte') else if sr.Size < 1024 * 1024 then li.SubItems.Add(IntToStr(round(sr.Size / 1024)) + ' KByte') else li.SubItems.Add(IntToStr(round(sr.Size / (1024 * 1024))) + ' MByte'); li.SubItems.Add(fi.szTypeName); until FindNext(sr) <> 0; FindClose(sr); Form1.ListView1.Items.EndUpdate; end; procedure TForm1.FormCreate(Sender: TObject); var fi: TSHFileInfo; lc: TListColumn; begin DriveComboBox1.DirList := DirectoryListBox1; with ListView1 do begin SmallImages := TImageList.CreateSize(16,16); SmallImages.Handle := ShGetFileInfo('*.*', 0, fi, SizeOf(fi), SHGFI_SMALLICON or SHGFI_ICON or SHGFI_SYSICONINDEX); LargeImages := TImageList.Create(nil); LargeImages.Handle := ShGetFileInfo('*.*', 0, fi, SizeOf(fi), SHGFI_LARGEICON or SHGFI_ICON or SHGFI_SYSICONINDEX); lc := Columns.Add; lc.Caption := 'Name'; lc := Columns.Add; lc.Caption := 'Size'; ComboBox1.Items.Add('Icons'); ComboBox1.Items.Add('List'); ComboBox1.Items.Add('Table'); ComboBox1.Items.Add('SmallIcons'); ComboBox1.ItemIndex := 0; end; UpdateFiles; end; procedure TForm1.DirectoryListBox1Change(Sender: TObject); begin UpdateFiles; end; procedure TForm1.ComboBox1Click(Sender: TObject); begin case ComboBox1.ItemIndex of 0: ListView1.ViewStyle := vsIcon; 1: ListView1.ViewStyle := vsList; 2: ListView1.ViewStyle := vsReport; else ListView1.ViewStyle := vsSmallIcon; end; end; |
#2
|
||||
|
||||
![]() Цитата:
|
#3
|
|||
|
|||
![]() Исходник не компилируется.. очень много ошибок ((
просмотрел код, не понял в какой компонент выводится список файлов и каким образом (( Последний раз редактировалось Rolls, 07.05.2010 в 14:44. |