Компонент отображения дерева данных — TreeView
Компонент TreeView(страница Win32) служит для отображения иерархических данных в виде дерева, в котором пользователь может выбрать нужный ему узел или узлы.
Основным свойством TreeView,содержащим информацию об узлах дерева, является Items.Доступ к информации об отдельных узлах осуществляется через свойство Items[int Index].Например, TreeViewl‑>Items->Item[0] —это узел дерева с индексом 0 (первый узел дерева). Каждый узел является объектом типа TTreeNodes,обладающим своими свойствами и методами (см.ниже).
Есть два способа формирования дерева: в окне редактора узлов дерева и программно.
I способ
Используется во время проектирования. Вызов окна редактора узлов производится двойным щелчком на компоненте TreeView или нажатием кнопки с многоточием около свойства Items в окне Инспектора Объектов.
Назначение кнопок окна редактора узлов
– New Item (новый узел) позволяет добавить в дерево новый узел. Он будет расположен на том же уровне, на котором расположен узел, выделенный курсором в момент щелчка на кнопке New Item.
– New Subltem (новый дочерний узел) позволяет добавить в дерево дочерний узел. Он будет расположен на уровень ниже уровня того узла, который выделен курсором в момент щелчка на кнопке New Subltem.
– Delete (удалить) удаляет выделенный узел дерева.
– Load позволяет загрузить структуру дерева из файла. Файл, хранящий структуру дерева это обычный текстовый файл, содержащий тексты узлов. Уровни узлов обозначаются отступами. Например, файл дерева и может иметь вид:
производство
цех 1
цех 2
цех 3
управление
администрация
бухгалтерия
II способ
Дерево можно формировать или перестраивать и во время выполнения приложения. Для этого служит ряд методов объектов типа TTreeNodes. Следующие методы позволяют вставлять в дерево новые узлы:
Add( Node, S) | Добавляет новый узел с текстом S как последний узел уровня, на котором расположен Node. |
AddFirst( Node, S) | Вставляет новый узел с текстом S как первый из узлов уровня, на котором находится Node. Индексы последующих узлов увеличиваются на 1. |
Insert(Node, S) | Вставляет новый узел с текстом S сразу после узла Node на то же уровень. Индексы последующих узлов увеличиваются на 1. |
AddChiId( Node, S) | Добавляет узел с текстом S как последний дочерний узла Node. |
AddChiIdFirst(Node, S) | Вставляет новый узел с текстом S как первый из дочерних узлов узла Node. Индексы последующих узлов увеличиваются на 1 |
Например:
//вставить на место выделенного, остальные сдвигаются //вниз:
TreeView1->Items->Insert(TreeView1->Items->
Item[TreeView1->Selected->AbsoluteIndex], "");
//Вставить нулевым на тот же уровень, что и выделенный:
TreeView1->Items->AddFirst(TreeView1->Items->
Item[TreeView1->Selected->AbsoluteIndex], "");
//Добавляет новый узел как последний узел уровня, на //котором расположен выделенный:
TreeView1->Items->Add(TreeView1->Items->
Item[TreeView1->Selected->AbsoluteIndex], "");
Каждый из этих методов возвращает вставленный узел. Ниже в качестве примера приведен код, формирующий дерево, которое вы можете видеть на рис.1
Рис.1
TreeViewl->Items->Clear(); // очистка списка
// добавление корневого узла "производство" (индекс 0)
TreeViewl->Items->Add(NULL, "Мои рисунки");
/* добавление дочених узлов "цех 1" - "цех 3"
(индексы 1-3) */
TreeViewl->Items->AddChiId(TreeViewl->Items->Item[0] , "Мореходы")
TreeViewl->Items->AddChild(TreeViewl->Items->Item[0],"Художник Васильев")
TreeViewl->Items->AddChild(TreeViewl->Items->Item[0],"Фото ВОВ")
Добавим программно ещё один узел «Тексты» с подузлами «Биографии» и «Пояснения»:
Рис.2
/* добавление корневого узла "Тексты" после узла "Мои рисунки" (индекс 4) */
TreeViewl->Items->Add(TreeViewl->Items->Item[0], "Тексты"
/* добавление дочених узлов "Биографии" и "Поясненияё" узла "управление" */
TreeViewl->Items->AddChild(TreeViewl->Items->Item[4],"Биографии");
TreeViewl->Items->AddChild(TreeViewl->Items->Item[4],"Пояснения");
Дерево может быть сколь угодно разветвленным. Например, следующие операторы добавляют дочерние узлы «Крузенштерн» и «Лисянский» в сформированный ранее узел «Мореходы»:
TreeViewl->Items->AddChild(ТreeViewl->Items->Item[l], "Крузенштерн");
TreeViewl->Items->AddChiId(TreeViewl->Items->Item[l], "Лисянский");
Рис.3
TTreeNode *Node=TreeView1->Selected;
int level=Node->Level; //Определяем уровень выделенного узла
int ind=Node->Index; //Идекс выделенного узла внутри уровня
TreeViewl->Items->Item[l]->Text ;// Текст,связанный с узлом 1
Для удаления узлов имеется два метода: Clear(void), очищающий все дерево, и Delete(TTreeNode* Node), удаляющий указанный узел Node и все его узлы — потомки.
Например, оператор
TreeViewl->Items->Clear(); /*удалит в нашем примере все узлы*/
TreeViewl->Items->Delete(TreeViewl->Items->Item[l]) ; /*удалит узел «Мореходы» и его дочерние узлы*/
Для редактирования текста выделенного узла есть метод:
TreeView1->Selected->EditText() ;
Его можно вставить, например, в обработку события OnDblClick
Вызов контекстного меню правой клавишей мышки.
TreeView1->PopupMenu = PopupMenu1;