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

Перевод списка файлов и каталогов из TStringList в TreeView с построением дерева каталогов

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

Перевод списка файлов и каталогов из TStringList в TreeView с построением дерева каталогов

Автор: Радионов Алексей
WEB-сайт: http://delphibase.endimus.com

{ **** UBPFD *********** by delphibase.endimus.com ****
>> Перевод списка файлов/каталогов из TStringList в
TreeView с построением "дерева каталогов"

Иногда бывает нужно построить "дерево каталогов" по
заданному списку файлов и папок (причем физически
эти файлы и каталоги могут не существовать).
Представляемый здесь код занимается именно этим.

Зависимости: sysutils, classes, comctrls
Автор:       Радионов Алексей (Alx2), alx@argo.mv.ru, ICQ:113442587, Ульяновск
Copyright:   Alx2
Дата:        3 июля 2002 г.
***************************************************** }

procedure FillTreeViewWithFiles(TreeView1: TTreeView; Strs: TStringList);
var
  CachedStrs: TStringList; // CachedStrs вводится для ускорения поиска
  // в уже готовом дереве.

  procedure AddItem(Lev: Integer; ParentNode: TTreeNode; S: string);
    function FindNodeWithText(AParent: TTreeNode; const S: string): TTreeNode;
    var
      K: Integer;
      fStr: string;
      tmpNode: TTreeNode;
    begin
      Result := nil;
      fStr := S + IntToStr(Integer(AParent));
      K := CachedStrs.IndexOf(fStr);
      if K > -1 then
        Result := Pointer(CachedStrs.Objects[K])
      else
      begin
        if AParent <> nil then
          tmpNode := AParent.getFirstChild
        else
          tmpNode := TreeView1.Items.GetFirstNode;
        while tmpNode <> nil do
        begin
          if tmpNode.Text = S then
          begin
            Result := tmpNode;
            CachedStrs.AddObject(fStr, Pointer(tmpNode));
            break;
          end;
          tmpNode := tmpNode.getNextSibling;
        end;
      end
    end;

  var
    prefix: string;
    ID: Integer;
    aNode: TTreeNode;
  begin
    if S = '' then
      Exit;
    ID := Pos('\', S);
    prefix := '';
    if ID > 0 then
      prefix := Copy(S, 1, ID - 1)
    else
    begin
      prefix := S;
      S := '';
    end;

    aNode := FindNodeWithText(ParentNode, prefix);

    if aNode = nil then
    begin
      aNode := TreeView1.Items.AddChild(ParentNode, prefix);
    end;

    AddItem(Lev + 1, aNode, Copy(S, ID + 1, Length(S)));

  end;

var
  K: Integer;
begin
  CachedStrs := TStringList.Create;
  CachedStrs.Duplicates := dupIgnore;
  CachedStrs.Sorted := True;
  try
    TreeView1.Items.BeginUpdate;
    TreeView1.SortType := stNone;
    for K := 0 to Strs.Count - 1 do
      AddItem(0, nil, Strs[K]);
  finally
    TreeView1.Items.EndUpdate;
    CachedStrs.Free;
  end;
end;

Пример использования:

// Построим, например, "дерево каталогов" по трем файлам:
procedure TForm1.Button1Click(Sender: TObject);
var
  Strs: TStringList;
begin
  Strs := TStringList.Create;
  try
    Strs.Add('D:\Program Files\Borland\Delphi6\Source\Vcl\Printers.dcu');
    Strs.Add('D:\Program Files\Borland\Delphi6\Source\Vcl\WinHelp.dcu');
    Strs.Add('C:\WINNTS\system\BORLNDMM.DLL');
    FillTreeViewWithFiles(TreeView1, Strs);
  finally
    Strs.Free;
  end;
end;

Here is the translation of the text into Russian:

Это фрагмент кода на Delphi, демонстрирующий, как заполнить TreeView-контрол с помощью списка файлов и директорий из TStringList-объекта. Код использует рекурсию для создания древовидной структуры, что полезно при представлении иерархических данных.

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

  1. Процедура FillTreeViewWithFiles:
    • Она принимает два параметра: TreeView1, TTreeView-контрол, и Strs, TStringList-объект, содержащий список файлов и директорий.
    • Процедура использует временный TStringList-объект, называемый CachedStrs, для хранения текста узла и соответствующего TTreeNode-объекта. Это сделано для ускорения поиска существующих узлов в дереве.
  2. Процедура AddItem:
    • Она рекурсивная процедура, добавляющая элемент в TreeView-контрол.
    • Она принимает три параметра: Lev, целочисленный уровень отступа, ParentNode, родительский TTreeNode-объект, и S, текст узла для добавления.
    • Процедура поиска узла с данным текстом в дереве и добавляет его, если не найден. Если найден, она возвращает существующий узел.
  3. Основной код:
    • Он создает TStringList-объект, называемый Strs, и заполняет его тремя путями к файлам: 'D:\Program Files\Borland\Delphi6\Source\Vcl\Printers.dcu', 'D:\Program Files\Borland\Delphi6\Source\Vcl\WinHelp.dcu' и 'C:\WINNTS\system\BORLNDMM.DLL'.
    • Он вызывает процедуру FillTreeViewWithFiles для заполнения TreeView-контрола списком файлов и директорий.

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

  1. Рассмотрите использование более описательного имени переменной вместо CachedStrs. Может быть что-то вроде NodeCache или TreeCache.
  2. Вы можете упростить функцию FindNodeWithText, используя метод IndexOf напрямую на объекте CachedStrs, а не циклом.
  3. В процедуре AddItem вы можете использовать более компактный способ конструирования текста узла, сконкатенировав префикс и суффикс строки.

Вот обновленная версия кода, включая эти предложения:

procedure FillTreeViewWithFiles(TreeView1: TTreeView; Strs: TStringList);
var
  NodeCache: TStringList;
  procedure AddItem(Lev: Integer; ParentNode: TTreeNode; S: string);
    function FindNodeWithText(AParent: TTreeNode; const S: string): TTreeNode;
    var
      K: Integer;
    begin
      Result := nil;
      if NodeCache.IndexOf(S) > -1 then
        Result := Pointer(NodeCache.Objects[K])
      else
         // ...
    end;

  var
    prefix, ID: string;
    aNode: TTreeNode;
  begin
     // ...
  end;

var
  K: Integer;
begin
  NodeCache := TStringList.Create;
  try
    TreeView1.Items.BeginUpdate;
    TreeView1.SortType := stNone;
    for K := 0 to Strs.Count - 1 do
      AddItem(0, nil, Strs[K]);
  finally
    TreeView1.Items.EndUpdate;
    NodeCache.Free;
  end;
end;

Надеюсь, это поможет! Пожалуйста, если у вас есть какие-либо дальнейшие вопросы.

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


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

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




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


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


реклама


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

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 11:48:10/0.0060279369354248/1