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

TreeView каталогов - как в левой части проводника

Delphi , Файловая система , Директории

TreeView каталогов - как в левой части проводника

Автор: Даниил Карапетян
WEB сайт: http://program.dax.ru

Когда ваш компьютер говорит "Вставьте диск #2", не торопитесь, сначала выньте диск номер один... даже если вы уверены, что сможете засунуть туда оба.

Самый простой способ - это при запуске программы найти все каталоги на диске и засунуть их в TreeView. Но у этого способа есть несколько недостатков. Во-первых, он долгий, особенно, если включен zif. Во-вторых, даже если закрыть и открыть какую-то папку, она не обновится. Поэтому лучше всего вначале сделать в TreeView список дисков со значком "+", то есть указать, что на диске есть каталоги. Это не всегда верно, но проверять, правда ли это, долго из-за дисковода. При попытке раскрыть каталог или диск программа ищет подкаталоги и добавляет их в ListView. В каждом подкаталоге программа пытается найти хотя бы один подкаталог. В зависимости от результатов поиска "+" появляется или нет. В этой программе используются иконки из файла FileCtrl.res, находящемся в каталоге "Delphi5\lib".


implementation

{$R *.DFM}
{$R FileCtrl}

procedure NextLevel(ParentNode: TTreeNode);

  function DirectoryName(name: string): boolean;
  begin
    result := (name > '.') and (name > '..');
  end;

var
  sr, srChild: TSearchRec;
  node: TTreeNode;
  path: string;
begin
  node := ParentNode;
  path := '';
  repeat
    path := node.Text + '\' + path;
    node := node.Parent;
  until
    node = nil;
  if FindFirst(path + '*.*', faDirectory, sr) = 0 then
  begin
    repeat
      if (sr.Attr and faDirectory > 0) and DirectoryName(sr.name) then
      begin
        node := Form1.TreeView1.Items.AddChild(ParentNode, sr.name);
        node.ImageIndex := 0;
        node.SelectedIndex := 1;
        node.HasChildren := false;
        if FindFirst(path + sr.name + '\*.*', faDirectory, srChild) = 0 then
        begin
          repeat
            if (srChild.Attr and faDirectory > 0) and
            DirectoryName(srChild.name) then
              node.HasChildren := true;
          until
            (FindNext(srChild) > 0) or node.HasChildren;
        end;
        FindClose(srChild);
      end;
    until
      FindNext(sr) > 0;
  end
  else
    ParentNode.HasChildren := false;
  FindClose(sr);
end;

procedure TForm1.FormCreate(Sender: TObject);
const
  IconNames: array [0..6] of string = ('CLOSEDFOLDER', 'OPENFOLDER',
  'FLOPPY', 'HARD', 'NETWORK', 'CDROM', 'RAM');
var
  c: char;
  s: string;
  node: TTreeNode;
  DriveType: integer;
  bm, mask: TBitmap;
  i: integer;
begin
  TreeView1.Items.BeginUpdate;
  TreeView1.Images := TImageList.CreateSize(16, 16);
  bm := TBitmap.Create;
  mask := TBitmap.Create;
  for i := low(IconNames) to high(IconNames) do
  begin
    bm.Handle := LoadBitmap(HInstance, PChar(IconNames[i]));
    bm.Width := 16;
    bm.Height := 16;
    mask.Assign(bm);
    mask.Mask(clBlue);
    TreeView1.Images.Add(bm, mask);
  end;
  for c := 'A' to 'Z' do
  begin
    s := c + ':';
    DriveType := GetDriveType(PChar(s));
    if DriveType = 1 then
      continue;
    node := Form1.TreeView1.Items.AddChild(nil, s);
    case DriveType of
      DRIVE_REMOVABLE: node.ImageIndex := 2;
      DRIVE_FIXED: node.ImageIndex := 3;
      DRIVE_REMOTE: node.ImageIndex := 4;
      DRIVE_CDROM: node.ImageIndex := 5;
      else
        node.ImageIndex := 6;
    end;
    node.SelectedIndex := node.ImageIndex;
    node.HasChildren := true;
  end;
  TreeView1.Items.EndUpdate;
end;

procedure TForm1.TreeView1Expanding(Sender: TObject; Node: TTreeNode;
var AllowExpansion: Boolean);
begin
  TreeView1.Items.BeginUpdate;
  node.DeleteChildren;
  NextLevel(node);
  TreeView1.Items.EndUpdate;
end;

Программное приложение на языке Delphi, созданное для отображения структуры каталогов компьютера с помощью контрола TreeView. В этом коде есть несколько разделов:

FormCreate

  • Создает экземпляр компонента TImageList для хранения иконок.
  • Загружает иконки из файлов в директории "Delphi5\lib" (например, CLOSEDFOLDER, OPENFOLDER и т.д.).
  • Настроивает контрол TreeView1:
    • Начинает обновление дерева.
    • Создает массив типов диск-дрейва и присваивает их соответствующим узлам в дереве.
    • Устанавливает индекс изображения для каждого узла в зависимости от его типа (например, removable, fixed, remote, CDROM).

NextLevel

  • Рекурсивно обходит структуру каталогов:
    • Найдет родительский каталог (ParentNode) и построит путь.
    • Ищет подкаталоги в текущем каталоге с помощью FindFirst и FindNext.
    • Добавляет каждый подкаталог как дочерний узел в дерево, устанавливая индекс изображения в 0 (закрытый каталог).
    • Если подкаталог имеет детей (т.е., содержит более подкаталогов), устанавливает свойство HasChildren в True.

TreeView1Expanding

  • Вызывается при расширении узла в дереве.
  • Начинает обновление дерева.
  • Удаляет любые существующие дочерние узлы для расширяющегося узла.
  • Вызывает процедуру NextLevel для рекурсивного обхода структуры каталогов и добавления новых дочерних узлов.

Основной проблемой этого кода является то, что он только обходит каталоги на диск-дрейвах, но не поддерживает сеть-сохранения или другие типы хранения. Кроме того, код плохо обрабатывает ошибки; если каталог недоступен или содержит невалидные записи, программа может рухнуть или выдать неожиданные результаты.

Для улучшения кода можно рассмотреть следующие меры:

  1. Добавить поддержку сеть-сохранений и других типов хранения.
  2. Реализовать обработку ошибок для предотвращения крахов или неожиданных поведений при встрече недоступных каталогов или невалидных записей.
  3. Оптимизировать процедуру NextLevel для уменьшения количества операций ввода-вывода на диск.
  4. Улучшить пользовательский интерфейс, добавив функции, такие как фильтрация, сортировка или поиск.

В целом, этот код предоставляет хороший старт для создания приложения-исследователя файловой системы на языке Delphi, но требует дальнейшей доработки и тестирования для превращения в надежное и надёжное инструмент.

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


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

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




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


:: Главная :: Директории ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-02-19 02:37:59/0.0037810802459717/0