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

Заполнение TTreeView каталогами и файлами с фильтром по типу

Delphi , Синтаксис , Деревья

- это распространенная задача при разработке приложений с использованием компонента TTreeView в Lazarus и Delphi. В данной статье мы рассмотрим, как заполнить TTreeView каталогами и файлами с фильтром по типу, используя примеры кода на Object Pascal (Delphi).

Заполнение TTreeView каталогами

Для заполнения TTreeView каталогами мы будем использовать процедуру AddDirectories, которая рекурсивно добавляет все каталоги в TTreeView. Вот пример кода, который заполняет TTreeView каталогами начиная с корня диска C:

procedure TForm1.FormClick(Sender: TObject);
var
  sr: TSearchRec;
  FileAttrs: Integer;
  theRootNode : tTreeNode;
  theNode : tTreeNode;
begin
  FileAttrs := faDirectory; // Только каталоги
  theRootNode := DirTree.Items.AddFirst(nil, 'c:\');
  if FindFirst('c:\*.*', FileAttrs, sr) = 0 then
  begin
    repeat
      if (sr.Attr and FileAttrs) = FileAttrs then
      begin
        theNode := DirTree.Items.AddChild(theRootNode, sr.Name);
        AddDirectories(theNode, 'c:\' + sr.Name);
      end;
    until FindNext(sr) <> 0;
    FindClose(sr);
  end;
  DirTree.FullExpand;
end;

procedure TForm1.AddDirectories(theNode: tTreeNode; cPath: string);
var
  sr: TSearchRec;
  FileAttrs: Integer;
  theNewNode : tTreeNode;
begin
  FileAttrs := faDirectory; // Только каталоги
  if FindFirst(cPath + '\*.*', FileAttrs, sr) = 0 then
  begin
    repeat
      if (sr.Attr and FileAttrs) = FileAttrs then
      begin
        theNewNode := DirTree.Items.AddChild(theNode, sr.Name);
        AddDirectories(theNewNode, cPath + '\' + sr.Name);
      end;
    until FindNext(sr) <> 0;
    FindClose(sr);
  end;
end;

В данном примере мы используем процедуру FindFirst для перебора всех каталогов в корне диска C. Для каждого каталога мы создаем новый узел в TTreeView и рекурсивно вызываем процедуру AddDirectories для заполнения подкаталогов.

Заполнение TTreeView файлами с фильтром по типу

Для заполнения TTreeView файлами с фильтром по типу мы будем использовать процедуру FilteredTV, которая рекурсивно добавляет все файлы выбранного типа в TTreeView. Вот пример кода, который заполняет TTreeView файлами типа PDF в выбранном каталоге:

procedure TForm1.FilteredTV(theDir: string; ext: String; startNode: tTreeNode);
var
  sr: TSearchRec;
  FileAttrs: Integer;
  theNode : tTreeNode;
begin
  if copy(ext, 1, 1) <> '.' then
    ext := '.' + ext;
  FileAttrs := faAnyfile;
  if startNode = nil then
    startNode := FileTree.Items.AddFirst(nil, theDir);
  if FindFirst(theDir + '\*.*', FileAttrs, sr) = 0 then
  begin
    repeat
      if (sr.Attr = faDirectory) and (copy(sr.Name, 1, 1) <> '.') then
      begin
        theNode := FileTree.Items.AddChild(startNode, sr.Name);
        theNode.ImageIndex := 0; // Использовать изображение папки для каталогов
        FilteredTV(theDir + '\' + sr.Name, ext, theNode);
      end
      else
        if ((sr.Attr and FileAttrs) = sr.Attr) and (ExtractFileExt(sr.Name) = ext)
        then
        begin
          theNode := FileTree.Items.AddChild(startNode, sr.Name);
          theNode.ImageIndex := -1; // Без изображения для файлов
        end;
    until FindNext(sr) <> 0;
    FindClose(sr);
  end;
  FileTree.FullExpand;
end;

В данном примере мы используем процедуру FindFirst для перебора всех файлов в выбранном каталоге. Для каждого файла мы проверяем расширение файла и добавляем его в TTreeView, если оно соответствует выбранному типу. Если файл является каталогом, мы рекурсивно вызываем процедуру FilteredTV для заполнения подкаталогов.

Вызов процедуры FilteredTV

Для вызова процедуры FilteredTV при выборе узла в TTreeView каталогов мы можем добавить следующий код в обработчик события OnClick для TTreeView каталогов:

procedure TForm1.DirTreeClick(Sender: TObject);
var
  cBuild: string;
  theNode: tTreeNode;
begin
  if DirTree.Selected <> nil then
  begin
    theNode := DirTree.Selected;
    cBuild := theNode.Text;
    while theNode.Parent <> nil do
    begin
      cBuild := theNode.Parent.Text + '\' + cBuild;
      theNode := theNode.Parent;
    end;
    cBuild := StringReplace(cBuild, '\', '/', [rfReplaceAll]);
    FilteredTV(cBuild, 'pdf', nil);
  end;
end;

В данном примере мы получаем выбранный узел в TTreeView каталогов и строим абсолютный путь к нему. Затем мы вызываем процедуру FilteredTV, передавая ей путь к каталогу и тип файлов для фильтрации.

Добавление иконок для узлов TTreeView

Для добавления иконок для узлов TTreeView мы можем использовать ImageList. Сначала нам нужно добавить ImageList в форму и добавить в него иконки для папок и файлов. Затем мы можем назначить ImageList для TTreeView и указать индексы иконок для узлов папок и файлов в коде. Вот пример кода, который добавляет иконки для узлов TTreeView:

procedure TForm1.FormCreate(Sender: TObject);
begin
  // Создание ImageList и добавление иконок
  ImageList1 := TImageList.Create(self);
  with ImageList1 do
  begin
    Handles := [0, 1]; // Индексы иконок для папок и файлов
    Images := [TBitmap.Create, TBitmap.Create]; // Создание битмапов для иконок
    // Загрузка иконок из файлов
    Images[0].LoadFromFile('c:\windows\system32\imageres.dll', 'FOLDER', 0, 0, clFolders, 0, 0, 0, 0);
    Images[1].LoadFromFile('c:\windows\system32\imageres.dll', 'FILE', 0, 0, clFiles, 0, 0, 0, 0);
  end;
  // Назначение ImageList для TTreeView
  DirTree.ImageList := ImageList1;
  FileTree.ImageList := ImageList1;
end;

В данном примере мы создаем ImageList и добавляем в него иконки для папок и файлов из файла imageres.dll. Затем мы назначаем ImageList для TTreeView каталогов и файлов. В коде, который добавляет узлы в TTreeView, мы можем указать индексы иконок для узлов папок и файлов, используя свойство ImageIndex узла.

Заключение

В данной статье мы рассмотрели, как заполнить TTreeView каталогами и файлами с фильтром по типу в Lazarus и Delphi. Мы использовали процедуры AddDirectories и FilteredTV для рекурсивного заполнения TTreeView каталогами и файлами, а также добавили примеры кода для вызова процедуры FilteredTV и добавления иконок для узлов TTreeView. Используя эти примеры кода, вы можете создать приложение с TTreeView, которое заполняется каталогами и файлами с фильтром по типу.

Создано по материалам из источника по ссылке.

В данном тексте рассматривается распространенная задача по заполнению компонента TTreeView каталогами и файлами с фильтром по типу в средах Lazarus и Delphi. Для этого используются процедуры `AddDirectories` и `FilteredTV`, которые рекурсивно добавляют ка


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

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




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


:: Главная :: Деревья ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-05-01 11:43:02/0.0055038928985596/1