Деревья
Цель лекции
Применение компонента TTreeView для работы с древовидными иерархическими данными.
Дерево TTreeView
Компонент TTreeView расположен на вкладке Common Controls Палитры компонентов, и предназначен для отображения различных древовидных иерархических структур:
Мы часто сталкиваемся с иерархической информацией. Это может быть т.н. Дерево каталогов в стандартном Проводнике Windows, которое отображает в виде ветвей дерева внешние и вложенные папки, и файлы, которые там хранятся. Это может быть структура предприятия, библиотечный каталогизатор, структура книги, реферата, курсовой… В общем, самая разная информация, в которой присутствуют родительские и дочерние (вложенные) объекты. Все подобные объекты можно отобразить с помощью компонента TTreeView.
Объекты, которые содержаться в данном компоненте называются узлами (англ. node), а сам компонент представляет собой список узлов. Подобно спискам TListBox и TComboBox, с которыми мы уже знакомы, TTreeView имеет свойство Items - индексированный список узлов. Каждый узел - это объект, который имеет тип TTreeNode. И родительские, и вложенные в них дочерние элементы - всё это узлы (объекты) типа TTreeNode. Причем дочерний элемент одновременно может быть родителем по отношению к другому узлу, уровень вложенности неограничен.
Но давайте-ка всё по порядку. Рассмотрим работу компонента на примере библиотечного каталога. Откройте Lazarus с новым проектом. Как обычно, форму назовите fMain, проект сохраните под именем MyLibrary в папку 19-01, модулю формы дайте имя Main. В свойстве Caption формы напишите Библиотечный каталог. Саму форму немного растяните, пусть у нас будет высота 350, а ширина 500 пикселей.
Далее, установим на форму простую панель TPanel, из нее мы сделаем своеобразную Панель инструментов программы. У панели очистите свойство Caption, в свойстве Align установите alLeft, в свойстве Width 127 пикселей.
Далее, на полученную Панель инструментов одну за другой установите 7 простых кнопок TButton. У всех кнопок в свойстве Left установите значение 1, а в свойстве Width - значение 125. Верхнюю кнопку расположите повыше (Top = 1), остальные - чуть ниже, чтобы между кнопками было совсем небольшое расстояние. Нам нужно переименовать кнопки и сделать на них соответствующие надписи. Сделайте следующие настройки кнопок:
| Name | Caption |
|---|---|
| bNewNode | Новый раздел |
| bNewChildNode | Новый подраздел |
| bDelete | Удалить |
| bEdit | Переименовать |
| bSort | Сортировать |
| bCollapse | Свернуть список |
| bExpand | Развернуть список |
Теперь, правее панели, с вкладки Common Controls установите компонент TTreeView. Поскольку дерево у нас одно, переименовывать его мы не будем. В свойстве Align дерева также установите значение alLeft, в свойстве Width установите 360 пикселей. Поверх TTreeView с этой же вкладки установите список изображений TImageList, его тоже переименовывать не будем. В результате у нас должна получиться вот такая форма:
Как видите, в правой части формы после TreeView1 осталось немного места. Сейчас мы научимся только производить различные действия с компонентом TTreeView, а позже, в другой лекции, мы вернемся к этому проекту, и в правой части сделаем отображение книг, которые относятся к данному разделу библиотеки.
Итак, выделите дерево TreeView1 и обратите внимание на его свойства. Мы рассмотрим только основные, с которыми еще не сталкивались в других компонентах.
Свойства TTreeView
| AutoExpand | - если True, то дерево автоматически распахивается, когда программа начинает работать, иначе список остается свернутым. Нам желательно, чтобы дерево было распахнуто, поэтому установите тут значение True. |
| HideSelection | - если True, то когда компонент теряет фокус (активным становится другой компонент), выделение текущего узла будет скрыто. Ну, это дело вкуса, можно оставить значение по умолчанию - True. |
| Images | - тут нужно выбрать список изображений, если хотите, чтобы у родительских и дочерних узлов были разные пиктограммы. Выберем тут ImageList1, а подходящие картинки подберем позже. |
| Indent | - расстояние в пикселях от левого узла до его подузлов. По умолчанию равно 15 пикселей, и я рекомендую это расстояние не уменьшать. Иначе узлы дерева будут расположены близко друг от друга, как бы слипнуться, что затруднит чтение списка. |
| Items | - сам список, основное свойство компонента. При нажатии на кнопку "…" выходит Редактор элементов дерева: |
Как видите, кнопки практически идентичны тем, что мы установили на форму, и работают примерно также. Так что мы не будем рассматривать работу с этим редактором, поскольку почти всегда дерево заполняют не вручную, а программно. Обратиться к отдельному узлу дерева можно через свойство Items, указав индекс элемента; индексация начинается с нуля. Например, к первому узлу в списке обращаются так: TreeView1.Items[0].
| MultiSelect | - если True, то разрешает одновременное выделение нескольких узлов; если False - запрещает. |
| MultiSelectStyle | - переключатели, которые определяют способ выделения нескольких узлов. Переключателей четыре, если они имеют значение True, то данный способ работает, иначе не работает:
|
| RightClickSelect | - при True узлы выделяются как левой, так и правой кнопкой мыши; при False - только левой. |
| RowSelect | - при True выделяется вся строка элемента, при False - только его имя. Бесполезное свойство, надо сказать. |
| ScrollBars | - полосы прокрутки, с ними вы знакомы по компоненту TMemo. Рекомендую устанавливать в этом свойстве значение ssAutoBoth. |
| ShowButtons | - разрешает (при True) или запрещает показ кнопок возле узлов. Обычно разрешает, тогда слева от закрытого узла будет кнопка с плюсом, от открытого - с минусом. |
| ShowLines | - разрешает показ линий ветвей дерева. Желательно оставлять True. |
| ShowRoot | - разрешает показ линии, идущей от корня дерева. Если ShowLines = False, то никаких линий не будет показано в любом случае. |
| SortType | - способ сортировки списка. К этому свойству мы еще вернемся в программе. Может быть:
|
TreeLineColor и TreeLinePenStyle отвечают за цвет и тип линий ветвей дерева.
Методы TTreeView
| AlphaSort | - еще один способ отсортировать список. Вызывается так:
TreeView1.AlphaSort;
|
| FullCollapse | - сворачивает дерево, скрывая все его дочерние узлы. |
| FullExpand | - наоборот, разворачивает дерево. |
| LoadFromFile | - метод считывает информацию об узлах из текстового файла. Файл сохраняется в формате UTF-8. Дочерние узлы находятся ниже родительских, и сдвинуты вправо символом табулятора. Перед использованием желательно проверять реальное наличие файла. |
| SaveToFile | - наоборот, сохраняет структуру дерева в текстовый файл. |
События TTreeView
Компонент имеет несколько специфичных событий, которые могут оказаться полезными.
| OnChange | - возникает после перемещения на другой узел. |
| OnChanging | - возникает перед перемещением на другой узел. При желании, можно сгенерировать это событие, и запретить пользователю этот переход, например, если не выполнено какое-то условие. |
| OnCollapsed | - возникает после свертывания узла. Пользователь может вызвать это событие, щелкнув по кнопке "-" рядом с узлом. |
| OnCollapsing | - возникает после свертывания узла. |
| OnCompare | - возникает, когда обработчик при сортировке списка сравнивает два узла и решает, который должен быть выше. |
| OnDeletion | - возникает при удалении узла. |
| OnEdited | - возникает после редактирования пользователем надписи узла. |
| OnEditing | - возникает во время редактирования надписи узла. |
| OnExpanded | - возникает после разворачивания узла. |
| OnExpanding | - возникает перед разворачивания узла. |
| OnGetImageIndex | - возникает при определении индекса изображения у узла из связанного TImageList. |
| OnGetSelectedIndex | - возникает при определении индекса текущего узла. |


