Рассмотрим довольно интересный пример, основанный на использовании функции поиска SearchlnFolder, – построение дерева каталогов для определенного диска (рис. 4.7).
Рис. 4.7. Дерево каталогов
Для простоты (и чтобы не отвлекать внимания от построения дерева) диск задается в программе жестко. При необходимости это можно легко исправить (как определять диски, вы уже знаете).
Рассмотрим работу приложения по порядку. Элемент управления TreeView на форме имеет имя tree. Содержимое списка изображений (ImageList), используемого деревом, приведено на рис. 4.8.
Рис. 4.8. Изображения для элементов дерева
Первый элемент дерева (соответствует диску) образуется при создании формы (листинг 4.27).
...
Листинг 4.27.
Создание первого элемента дерева – диска
procedure TForm3.FormCreate(Sender: TObject);
begin
//Корневой элемент дерева (диск)
root := tree.Items.Add(tree.Items.GetFirstNode, \'C:\');
root.ImageIndex := 0;
root.SelectedIndex := 0;
SetExpanded(root, False);
end;
Здесь и далее в примере root позволяет быстро получать доступ к корневому элементу дерева. Используемая в листинге 4.27 процедура применяется для установки состояния элементов дерева (листинг 4.28).
...
Листинг 4.28.
Установка состояния элемента дерева
procedure TForm3.SetExpanded(Node: TTreeNode; isExpanded: Boolean);
begin
if isExpanded then
begin
//Подготавливаем элемент к загрузке содержимого каталога
Node.Data := Pointer(1);
Node.DeleteChildren;
end
else
begin
//Содержимое каталога не прочитано (или его следует обновить)
Node.Data := Pointer(0);
Node.Collapse(False);
Node.DeleteChildren;
tree.Items.AddChild(Node, \'\'); //Фиктивный элемент(чтобы
//отображался "+", позволяющий
//развернуть элемент)
end;
end;
Если после создания элементов дерева процедура SetExpanded вызывается с параметром isExpanded, равным False (как в листинге 4.27), то для переданного в процедуру элемента дерева создается фиктивный дочерний элемент. Это делается для того, чтобы не зачитывать содержимое каждого не развернутого еще элемента дерева (для папок с большим количество файлов программа будет сильно «тормозить»). А так у каждого еще не развернутого элемента отображается символ +, позволяющий развернуть его в нужный момент. При этом не нужно забывать удалять созданный фиктивный элемент дерева (что и делает SetExpanded с параметром isExpanded, равным True).
Каждый не развернутый еще элемент дерева помечается значением поля Node. Data, равным 0. Каждый элемент, содержимое которого уже прочитано с диска, помечается значением поля Node. Data, равным 1. Для проверки, было ли прочитано содержимое каталога, соответствующего элементу дерева, используется простая функция IsExpanded (листинг 4.29).
...
Листинг 4.29.
Проверка, загружено ли содержимое каталога
function TForm3.IsExpanded(Node: TTreeNode): Boolean;
begin
IsExpanded := Integer(Node.Data) = 1;
end;
Загрузка содержимого каталога и одновременное формирование дочерних элементов в дереве происходят при разворачивании элемента дерева (листинг 4.30).
...
Листинг 4.30.
Загрузка содержимого каталога
procedure TForm3.treeExpanding(Sender: TObject; Node: TTreeNode;
var AllowExpansion: Boolean);
var
strFolder: String;
subfolders: TStrings;
i: Integer;
item: TTreeNode;
begin
if not IsExpanded(Node) then
//Содержимое каталога нужно зачитать
SetExpanded(Node, True)
else
begin
//Список подкаталогов для выделенного каталога
//был составлен ранее
AllowExpansion := True;
Exit;
end;
//Составление списка подкаталогов
strFolder := NodeToFolderPath( Node );
subfolders := TStringList.Create;
if SearchInFolder(strFolder, \'*\', FILE_ATTRIBUTE_DIRECTORY,
subfolders)
then begin
//Добавим в дерево элементы, соответствующие подкаталогам
for i := 0 to subfolders.Count – 1 do
begin
item := tree.Items.AddChild(Node, subfolders[i]);
item.ImageIndex := 1;
item.SelectedIndex := 2;
SetExpanded(item, False); //Содержимое подкаталога еще
//не прочитано
end;
AllowExpansion := True;
end
else
//В каталоге нет подкаталогов
AllowExpansion := False;
subfolders.Free;
end;
В листинге 4.30 для определения пути каталога, заданного элементом дерева, используется функция NodeToFolderPath. Реализуется она совсем несложно (листинг 4.31).
...
Листинг 4.31.
Определение полного пути элемента дерева
Читать дальше
Конец ознакомительного отрывка
Купить книгу