Delphi. Панель Win32. Компонент TreeView. Часть 2.

В предыдущей части мы рассмотрели создание дерева с помощью редактора узлов.

Теперь рассмотрим, как динамически управлять построением дерева в процессе работы программы.

Пусть нам необходимо изобразить в виде дерева оглавление книги. Отобразим его в виде списка:

1Гл_1 пар_1 разд_1 часть_1
2Гл_1 пар_1 разд_1 часть_2
3Гл_1 пар_1 разд_2 часть_1
4Гл_1 пар_2 разд_1 часть_1
5Гл_1 пар_2 разд_1 часть_2
6Гл_1 пар_2 разд_1 часть_3
7Гл_2 пар_1 разд_1 часть_1
8Гл_2 пар_2 разд_1
9Гл_2 пар_2 разд_2
10Гл_2 пар_2 разд_3

Разместим на форме компонент TreeView, компонент Edit и набор кнопок:

В итоге работы программы получим следующий результат, соответствующий таблице:

Коды обработчиков событий.

procedure TForm1.Button1Click(Sender: Tobject);
begin
//Добавить узел в начало цепочки узлов.

//читаем выбранный узел. Если дерево пустое, то node=nil и автоматически добавляется первый узел
node:=self.TreeView1.Selected;//берём выбранный узел и записываем его в «node» (переменная «node:TTreeNode» в программе объявлена как глобальная)

//добавляет узел и делает его первым в той цепочке узлов, в которой находится узел «node». В «edit1.Text» размещаем название узла.
self.TreeView1.Items.AddFirst(node,edit1.Text);
end;

procedure TForm1.Button4Click(Sender: Tobject);
begin
//Добавить узел в конец цепочки узлов
node:=self.TreeView1.Selected;
self.TreeView1.Items.Add(node,edit1.Text);
end;

procedure TForm1.Button6Click(Sender: Tobject);
begin
//Вставить узел перед выбранным узлом
node:=self.TreeView1.Selected;
self.TreeView1.Items.Insert(node,edit1.Text);
end;

procedure TForm1.Button2Click(Sender: Tobject);
begin
//Добавить дочерний узел в начало дочерней цепочки узлов
node:=self.TreeView1.Selected;
self.TreeView1.Items.AddChildFirst(node,edit1.Text);
end;

procedure TForm1.Button5Click(Sender: Tobject);
begin
//Добавить дочерний узел в конец дочерней цепочки узлов
node:=self.TreeView1.Selected;
self.TreeView1.Items.AddChild(node,edit1.Text);
end;

procedure TForm1.Button3Click(Sender: Tobject);
var i:integer;
begin
//Удалить выбранный узел
node:=self.TreeView1.Selected;
self.TreeView1.Items.Delete(node);
end;

procedure TForm1.Button7Click(Sender: Tobject);
begin
//сохранить дерево в файл
self.TreeView1.SaveToFile(‘tree’);
end;

procedure TForm1.Button9Click(Sender: Tobject);
begin
//загрузить узлы в дерева
self.TreeView1.LoadFromFile(‘tree’);
end;

procedure TForm1.Button9Click(Sender: Tobject);
begin
//загрузить узлы в дерева
self.TreeView1.LoadFromFile(‘tree’);
end;

procedure TForm1.Button10Click(Sender: Tobject);
begin
//редактировать текст узла
node:=self.TreeView1.Selected;
node.Text:=self.Edit1.Text;
end;

На последующем видео показаны результаты работы представленного кода.

Предварительно приведём краткие пояснения.

Вставить узел в конец.

Первая кнопка вставляет узел в конец списка узлов, в котором находится узел «node».

Сначала определяется выбранный в дереве узел:

node:=self.TreeView1.Selected;
Затем узел вставляется последним в цепочке узлов, содержащих узел «node»
self.TreeView1.Items.Add(node,edit1.Text);

Вставить узел перед выбранным узлом.

node:=self.TreeView1.Selected;

Узел будет вставлен пере узлом «node»
self.TreeView1.Items.Insert(node,edit1.Text);

Добавить дочерний узел в начало дочерней цепочки узлов.

node:=self.TreeView1.Selected;
Создаётся узел, дочерний по отношению к узлу «node». Узел вставляется в первую позицию в цепочке дочерних узлов.
self.TreeView1.Items.AddChildFirst(node,edit1.Text);

Добавить дочерний узел в конец дочерней цепочки узлов.

node:=self.TreeView1.Selected;
Создаётся узел, дочерний по отношению к узлу «node». Узел вставляется в последнюю позицию в цепочке дочерних узлов.
self.TreeView1.Items.AddChild(node,edit1.Text);

Удалить выбранный узел.

node:=self.TreeView1.Selected;
self.TreeView1.Items.Delete(node);

Сохранить дерево в файл.

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

Если файл будет находиться во внешней папке, то необходимо указать полный путь доступа к файлу.

Если, например, в папке, содержащей исполняемый файл, есть вложенная папка «folder_tree», то необходимо указать «folder_tree\tree»

self.TreeView1.SaveToFile(‘tree’);

Загрузить узлы в дерева.

Аналогично загружаем дерево из файла.

self.TreeView1.LoadFromFile(‘tree’);

Удалить все узлы дерева.

Взять самый первый узел дерева.
node:=self.TreeView1.Items.GetFirstNode;

Далее организуем цикл с предусловием. Цикл будет выполняться до тех пор, пока попытка взятия следующего узла с помощью метода «GetFirstNode» является успешной и метод «GetFirstNode» возвращает не «nil»:

while node<>nil do
begin
Удаляем первый узел. После этого узел, следовавший за первым, сам становится первым.
self.TreeView1.Items.Delete(node);
Пытаемся взять первый узел.
node:=self.TreeView1.Items.GetFirstNode;
end;

Но это так, для тренировки. То же самое можно сделать с помощью единственной строки, применив метод «Clear»:

self.TreeView1.Items.Clear;

Редактировать текст узла.

Получаем выбранный узел.

node:=self.TreeView1.Selected;
Изменяем текст выбранного узла.
node.Text:=self.Edit1.Text;
end;

Видео, поясняющее работу разобранных методов.

Кроме рассмотренных методов, полезными могут оказаться следующие свойства и методы.

Свойства.

self.TreeView1.Items.Count – возвращает количество узлов дерева.

self.TreeView1.Items[i].Count – возвращает количество дочерних узлов, имеющихся у узла «Items[i]».

Замечание. Вообще говоря, полная запись для доступа к узлу [i], должна иметь вид self.TreeView1.Items.Item[i]. Но свойство Item является свойством по умолчанию, и поэтому его можно опускать.

self.TreeView1.Items[i].AbsoluteIndex — абсолютный индекс узла.

Методы

self.TreeView1.Items[i].getFirstChild.Text — получить первый дочерний узел.

self.TreeView1.Items[i].getLastChild.Text — получить последний дочерний узел.

В следующей статье рассмотрим автоматизацию построения дерева с помощью списка.

Продолжение часть 3.1

Обновлено: 07.11.2021 — 17:43

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *