Russian Belarusian English German Japanese Ukrainian

Rashka.studio - игры и приложения для Android! Заходи, ждём тебя =)

TreeView и Outline - отображение дерева данных

CuBook4.735

Компоненты TreeView и Outline служат для отображения иерархических данных в виде дерева, в котором пользователь может выбрать нужный ему узел или узлы. Иерархическая информация может быть самой разной: структура некоторого предприятия, структура документации учреждения, структура отчета и т.п. С каждым узлом дерева могут быть связаны некоторые данные.
 
Возможности компонента TreeView несколько шире, чем компонента Outline. К тому же TreeView 32-разрядный компонент, a Outline 16-разрядный. По-этому Outline целесообразно использовать только в приложениях, предназначенных для работы в любых версиях Windows, включая Windows 3.x.
 
Основным свойством TreeView, содержащим информацию об узлах дерева, является Items. Доступ к информации об отдельных узлах осуществляется через свойство Items[int Index]. Например:
TreeView1->Items->ltem[0];
Это узел дерева с индексом 0 (первый узел дерева). Каждый узел является объектом типа TTreeNodes, обладающим своими свойствами и методами.
 
Во время проектирования формирование дерева осуществляется в окне редактора узлов дерева. Это окно вызывается двойным щелчком на компоненте TreeView или нажатием кнопки с многоточием около свойства Items в окне Инспектора Объектов.
Кнопка New Item (новый узел) позволяет добавить в дерево новый узел. Он будет расположен на том же уровне, на котором расположен узел, выделенный курсором в момент щелчка на кнопке New Item.
 
Кнопка New Subltem (новый дочерний узел) позволяет добавить в дерево дочерний узел. Он будет расположен на уровень ниже уровня того узла, который выделен курсором в момент щелчка на кнопке New Subltem.
Кнопка Delete (удалить) удаляет выделенный узел дерева.
Кнопка Load позволяет загрузить структуру дерева из файла.
Файл, хранящий структуру дерева - это обычный текстовый файл, содержащий тексты узлов. Уровни узлов обозначаются отступами. Например, файл дерева может иметь вид:
производство
- цех 1
- цех 2
- цех 3
управление
- администрация
- бухгалтерия
Для каждого нового узла дерева можно указать ряд свойств в панели Item Properties окна. Это прежде всего свойство Text - надпись, появляющаяся в дереве около данного узла. Свойства Image Index и Selected Index определяют индекс пиктограммы, отображаемой для узла, который соответственно не выделен и выделен пользователем в данный момент. Эти индексы соответствуют списку изображений, хранящихся в отдельном компоненте ImageList. Указание на этот компонент вы можете задать в свойстве Images компонента TreeView, Индексы начинаются с 0. Если вы укажете индекс -1 (значение по умолчанию), пиктограммы изображаться не будут. Последнее свойство State Index в панели Item Properties позволяет добавить вторую пиктограмму в данный узел, не зависящую от состояния узла. Подобная пиктограмма может просто служить дополнительной характеристикой узла. Индекс, указываемый как State Index, соответствует списку изображений, хранящихся в отдельном компоненте ImageList, указанном в свойстве Statelmages компонента TreeView.
 
Мы рассмотрели формирование дерева в процессе проектирования. Однако дерево можно формировать или перестраивать и во время выполнения приложения. Для этого служит ряд методов объектов типа TTreeNodes. Следующие методы позволяют вставлять в дерево новые узлы:
Значение Описание
Add(TTreeNode* Node,
const System::AnsiString S)
Добавляет новый узел с текстом S как последний узел уровня, на котором расположен Node.
AddFirst(TTreeNode* Node,
const System::AnsiString S)
Вставляет новый узел с текстом S как первый из узлов уровня, на котором находится Node. Индексы последующих узлов увеличиваются на 1.
Insert(TTreeNode* Node,
const System::AnsiString S)
Вставляет новый узел с текстом S сразу после узла Node на то же уровень. Индексы последующих узлов увеличиваются на 1.
AddChiId(TTreeNode* Node,
const System::AnsiString S)
Добавляет узел с текстом S как последний дочерний узла Node.
AddChiIdFirst(TTreeNode* Node,
const System::AnsiString S)
Вставляет новый узел с текстом S как первый из дочерних узлов узла Node. Индексы последующих узлов увеличиваются на 1.
Каждый из этих методов возвращает вставленный узел.
Текст, связанный с некоторым узлом, можно найти с помощью его свойства Text. Например:
TreeView1->Items->Item[1]->Text;
Это надпись «цех 1».
С каждым узлом может быть связан некоторый объект. Добавление таких узлов осуществляется методами AddObject, AddObjectFirst, InsertObject, AddChildObject, AddChildObjectFirst, аналогичными приведенным выше, но содержащими в качестве параметра еще указатель на объект:
Значение Описание
AddObject(TTreeNode* Node,
const System::AnsiString S, void * Ptr)
Добавляет новый узел с текстом S и объектом Ptr как последний узел уровня, на котором расположен Node.
AddObjectFirst(TTreeNode* Node,
const System::AnsiString S, void * Ptr)
Вставляет новый узел с текстом S и объектом Ptr как первый из узлов уровня, на котором находится Node. Индексы последующих узлов увеличиваются на 1.
InsertObject(TTreeNode* Node,
const System::AnsiString S, void * Ptr)
Вставляет новый узел с текстом S и объектом Ptr сразу после узла Node на то же уровень. Индексы последующих узлов увеличиваются на 1.
AddChildObject(TTreeNode* Node,
const System::AnsiString S, void * Ptr)
Добавляет узел с текстом S и объектом Ptr как последний дочерний узла Node.
AddChiIdObjectFirst(TTreeNode* Node, const System::AnsiString S, void * Ptr) Вставляет новый узел с текстом S и объектом Ptr как первый из дочерних узлов узла Node. Индексы последующих узлов увеличиваются на 1.
Объект, связанный с некоторым узлом, можно найти с помощью его свойства Data. Например:
TreeView1->Items->Item[1]->Data.
Для удаления узлов имеется два метода:
- Clear(void) очищающий все дерево
- Delete(TTreeNode* Node) удаляющий указанный узел Node и все его узлы - потомки. Например, оператор удалит в нашем примере все узлы:
TreeView1->Items->Clear();
оператор удалит узел «цех 1» и его дочерние узлы (если они имеются):
TreeView1->Items->Delete (TreeView1->Items->ltem[1]);
При удалении узлов, связанных с объектами, сами эти объекты не удаляются.
 
Реорганизация дерева, связанная с созданием или удалением многих узлов, может вызывать неприятное мерцание изображения. Избежать этого можно с помощью методов BeginUpdate и EndUpdate. Первый из них запрещает перерисовку дерева, а второй разрешает. Таким образом, изменение структуры дерева может осуществляться по следующей схеме:
TreeView1->Items->BeginUpdate();
<операторы изменения дерева>
TreeView1->Items->EndUpdate();
Если метод BeginUpdate применен подряд несколько раз, то перерисовка дерева произойдет только после того, как столько же раз будет применен метод EndUpdate.
Среди свойств узлов следует отметить Count - число узлов, управляемых данным, т.е. дочерних узлов, их дочерних узлов и т.п. Если значение Count узла равно нулю, значит у него нет дочерних узлов, т.е. он является листом дерева.
 
Компонент TreeView
Важным свойством компонента TreeView является Selected. Это свойство указывает узел, который выделен пользователем. Пользуясь этим свойством можно запрограммировать операции, которые надо выполнить для выбранного пользователем узла. Если ни один узел не выбран, значение Selected равно NULL. При выделении пользователем нового узла происходят события OnChanging (перед изменением выделения) и OnChanged после выделения. В обработчик события OnChanging передаются параметры TTreeNode *Node - узел, который выделен в данный момент, и bool &AllowChange - разрешение на перенос выделения. Если в обработчике задать AllowChange = false, то переключение выделения не произойдет. В обработчик события OnChanged передается только параметр TTreeNode *Node - выделенный узел. В этом обработчике можно предусмотреть действия, которые должны производится при выделении узла.
 
У компонента TreeView имеется свойство RightClickSelect, разрешающее (при значении равном true) выделение узла щелчком как левой, так и правой кнопкой мыши. Но и в этом случае событие OnChanged наступает только при выделении узла левой кнопкой мыши.
Ряд событий компонента TreeView связан с развертыванием и свертыванием узлов. При развертывании узла происходят события OnExpanding (перед развертыванием) и OnExpanded (после развертывания). В обработчики обоих событий передается параметр TTreeNode *Node - развертываемый узел. Кроме того в обработчик OnExpanding передается параметр bool &AllowExpansion, который можно задать равным false, если желательно запретить развертывание. При свертывании узла происходят события OnCollapsing (перед свертыванием) и OnCollapsed (после свертывания). Так же, как и в событиях, связанных с развертыванием, в обработчики передается параметр TTreeNode *Node - свертываемый узел, а в обработчик OnCollapsing дополнительно передается параметр bool &AllowCollapse, разрешающий или запрещающий свертывание.
 
Свойство ReadOnly компонента TreeView позволяет запретить пользователю редактировать отображаемые данные. Если редактирование разрешено, то при редактировании возникают события OnEditing и OnEdited, аналогичные рассмотренным ранее (в обработчике OnEditing параметр bool &AllowEdit позволяет запретить редактирование).
 
Ряд свойств компонента TreeView: ShowButtons, ShowLines, ShowRoot отвечают за изображение дерева и позволяют отображать или убирать из него кнопки, показывающие раскрытия узла, линии, связывающие узлы, и корневой узел.
Свойство SortType позволяет автоматически сортировать ветви и узлы дерева. По умолчанию это свойство равно stNone, что означает, что дерево не сортируется. Если установить SortType равным stText, то узлы будут автоматически сортироватъся по алфавиту. Возможно также проводить сортировку по связанным с узлами объектам Data (значение SortType равно stData), одновременно по тексту и объектам Data (значение SortType равно stBoth) или любым иным способом. Для использования этих возможностей сортировки надо написать обработчик события OnCompare, в который передаются, в частности, параметры TTreeNode *Node1 и TTreeNode *Node2 - сравниваемые узлы, и параметр int &Compare, в который надо заносить результат сравнения:
- отрицательное число, если узел Node1 должен располагаться ранее Node2;
- 0, если эти узлы считаются эквивалентными;
- положительное число, если узел Node1 должен располагаться в дереве после Node2.
 
Например, следующий оператор в обработчике события OnCompare обеспечивает обратный алфавитный порядок расположения узлов:
Compare = - AnsiStrlComp(Node1->Text.c_str(),Node2->Text.c_str());
События OnCompare наступают после задания любого значения SortType, отличного от stNone, и при изменении пользователем свойств узла (например, при редактировании им надписи узла), если значение SortType не равно stNone. После сортировки первоначальная последовательность узлов в дереве теряется. Поэтому последующее задание SortType = stNone не восстанавливает начальное расположение узлов, но исключает дальнейшую генерацию событий OnCompare, т.е. автоматическую перестановку узлов, например, при редактировании их надписей. Если же требуется изменить характер сортировки или провести сортировку с учетом новых созданных узлов, то надо сначала задать значение SortType = stNone, а затем задать любое значение SortType, отличное от stNone. При этом будут сгенерированы новые обращения к обработчику событий OnCompare.
 
Имеются и другие возможности сортировки. Например, метод AlphaSort(void) обеспечивает алфавитную последовательность узлов независимо от значения SortType, но при отсутствии обработчика событий OnCompare (если обработчик есть, то при выполнении метода AlphaSort происходит обращение к этому обработчику). Отличие метода AlphaSort от задания значения SortType = stText заключается в том, что изменение надписей узлов приводит к автоматической пересортировке дерева только при SortType = stText.
 
Компонент Outline
Компонент Outline похож на компонент TreeView. Структура дерева тоже содержится в свойстве Items и доступ к отдельным узлам также осуществляется через этот индексный список узлов. Но индексы начинаются с 1. Например, Outline1->Items[1]->Text - это текст узла дерева с индексом 1 (первого узла).
Свойство Items имеет тип TOutlineNode. Его свойства и методы отличаются от свойств и методов типа узлов в TreeView. И заполняется структура дерева, иначе, через свойство Lines типа TStrings. Редактор этого свойства можно вызвать, щелкнув на кнопке с многоточием около свойства Lines в окне Инспектора Объектов. Вы попадете в окно, в котором можете записать тексты всех узлов, делая отступы, чтобы выделить уровни узлов. Текст должен выглядеть так, как выше описывалось представление структуры в текстовом файле.
 
Пиктограммы, сопровождающие изображения узлов, задаются параметрами PictureOpen (пиктограмма развернутого узла), PictureClosed (пиктограмма свернутого узла), PictureMinus (пиктограмма символа "-" около развернутого узла, имеющего наследников), PicturePlus (пиктограмма символа "+" узла, имеющего наследников, но не развернутого), PictureLeaf (пиктограмма узла, не имеющего наследников - листа дерева). Основное отличие пиктограмм компонента Outline заключается в том, что они одинаковы для всех узлов одного типа, тогда как в TreeView можно задавать пиктограммы индивидуально для каждого узла.
 
Программно изменять структуру дерева можно с помощью методов Add, AddObject (добавление узла в дерево), Insert, InsertObject (вставка узла в заданную позицию), AddChild, AddChildObject (вставка дочернего узла), Delete (удаление узла).
Индекс выделенного пользователем узла можно определить через свойство Selectedltem. Если Selectedltem = 0, значит ни один узел не выделен. Текст выделенного узла определяется свойством Text удалит в нашем примере все узлы
Если заметили ошибку, выделите фрагмент текста и нажмите Ctrl+Enter

  Комментарии

0 Alex 10.05.2015 09:16 #1
Возможно ли в TreeView скрыть(сделать невидимым) определенный узел?

Цитата:

Нет. Как вариант, в процессе удалять и создавать узлы.

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


Защитный код Обновить