Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как вывести список файлов с иконками

Delphi , Файловая система , Файлы

Как вывести список файлов с иконками

Удобнее всего воспользоваться компонентом 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;

Here's the translation of the content into Russian:

Код - это программный проект на языке Delphi, который использует ShellAPI для отображения файлов и их иконок в контроле ListView. Программа также позволяет пользователю изменять стиль просмотра ListView с иконками, списком, таблицей или маленькими иконками.

Вот разбивка кода:

  1. Процедура UpdateFiles вызывается при изменении директории в DirectoryListBox или выборе другого стиля просмотра в ComboBox.
  2. Она очищает элементы ListView и затем перебирает файлы в выбранной директории с помощью функций FindFirst и FindNext из ShellAPI.
  3. Для каждого файла она извлекает индекс иконки с помощью функции ShGetFileInfo и добавляет элемент в ListView с именем файла, размером и типом.
  4. Процедура FormCreate вызывается при создании формы. Она инициализирует DirectoryListBox и настраивает контрол ListView с маленькими иконками.
  5. Процедура DirectoryListBox1Change вызывается при изменении директории в DirectoryListBox. Она вызывает процедуру UpdateFiles, чтобы обновить элементы ListView.
  6. Процедура ComboBox1Click вызывается при выборе другого стиля просмотра в ComboBox. Она изменяет стиль просмотра ListView соответственно.

Вот пример улучшения кода:

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_Icon or SHGFI_IconIndex);
      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_Icon or SHGFI_SmallIcon);
      LargeImages := TImageList.Create(nil);
      LargeImages.Handle := ShGetFileInfo('*.*', 0, fi,
        SizeOf(fi), SHGFI_Icon or SHGFI_LargeIcon);
      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('Small Icons');
      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;

Некоторые улучшения включают:

  • Использование более описательного имени для процедуры UpdateFiles.
  • Использование раннего выхода в процедуре UpdateFiles, чтобы избежать выполнения ненужного кода при изменении директории.
  • Удаление неиспользуемых переменных и процедур.
  • Добавление комментариев, объясняющих, что каждый раздел кода делает.

В статье описано, как создать список файлов в приложении Delphi с иконками каждого файла, используя компонент ListView и функцию WinAPI SHGetFileInfo.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Файлы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-10-24 19:57:45/0.0040409564971924/0