В предыдущей части мы рассмотрели создание дерева с помощью редактора узлов.
Теперь рассмотрим, как динамически управлять построением дерева в процессе работы программы.
Пусть нам необходимо изобразить в виде дерева оглавление книги. Отобразим его в виде списка:
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 — получить последний дочерний узел.
В следующей статье рассмотрим автоматизацию построения дерева с помощью списка.