Учебный центр "ANIT Texno Inform"
Опубликован: 25.06.2014 | Доступ: свободный | Студентов: 2595 / 849 | Длительность: 24:39:00
Специальности: Программист
Лекция 17:

Деревья

Аннотация: Лекция посвящена работе с древовидными иерархическими структурами данных, и компонентом TTreeView. На практике показаны все основные действия с компонентом.

Цель лекции

Применение компонента TTreeView для работы с древовидными иерархическими данными.

Дерево TTreeView

Компонент TTreeView расположен на вкладке Common Controls Палитры компонентов, и предназначен для отображения различных древовидных иерархических структур:

Компонент TTreeView

Рис. 19.1. Компонент TTreeView

Мы часто сталкиваемся с иерархической информацией. Это может быть т.н. Дерево каталогов в стандартном Проводнике 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), остальные - чуть ниже, чтобы между кнопками было совсем небольшое расстояние. Нам нужно переименовать кнопки и сделать на них соответствующие надписи. Сделайте следующие настройки кнопок:

Таблица 19.1. Настройки свойств кнопок
Name Caption
bNewNode Новый раздел
bNewChildNode Новый подраздел
bDelete Удалить
bEdit Переименовать
bSort Сортировать
bCollapse Свернуть список
bExpand Развернуть список

Теперь, правее панели, с вкладки Common Controls установите компонент TTreeView. Поскольку дерево у нас одно, переименовывать его мы не будем. В свойстве Align дерева также установите значение alLeft, в свойстве Width установите 360 пикселей. Поверх TTreeView с этой же вкладки установите список изображений TImageList, его тоже переименовывать не будем. В результате у нас должна получиться вот такая форма:

Полученная форма

Рис. 19.2. Полученная форма

Как видите, в правой части формы после TreeView1 осталось немного места. Сейчас мы научимся только производить различные действия с компонентом TTreeView, а позже, в другой лекции, мы вернемся к этому проекту, и в правой части сделаем отображение книг, которые относятся к данному разделу библиотеки.

Итак, выделите дерево TreeView1 и обратите внимание на его свойства. Мы рассмотрим только основные, с которыми еще не сталкивались в других компонентах.

Свойства TTreeView

AutoExpand - если True, то дерево автоматически распахивается, когда программа начинает работать, иначе список остается свернутым. Нам желательно, чтобы дерево было распахнуто, поэтому установите тут значение True.
HideSelection - если True, то когда компонент теряет фокус (активным становится другой компонент), выделение текущего узла будет скрыто. Ну, это дело вкуса, можно оставить значение по умолчанию - True.
Images - тут нужно выбрать список изображений, если хотите, чтобы у родительских и дочерних узлов были разные пиктограммы. Выберем тут ImageList1, а подходящие картинки подберем позже.
Indent - расстояние в пикселях от левого узла до его подузлов. По умолчанию равно 15 пикселей, и я рекомендую это расстояние не уменьшать. Иначе узлы дерева будут расположены близко друг от друга, как бы слипнуться, что затруднит чтение списка.
Items - сам список, основное свойство компонента. При нажатии на кнопку "" выходит Редактор элементов дерева:

Редактор элементов компонента TTreeView

Рис. 19.3. Редактор элементов компонента TTreeView

Как видите, кнопки практически идентичны тем, что мы установили на форму, и работают примерно также. Так что мы не будем рассматривать работу с этим редактором, поскольку почти всегда дерево заполняют не вручную, а программно. Обратиться к отдельному узлу дерева можно через свойство Items, указав индекс элемента; индексация начинается с нуля. Например, к первому узлу в списке обращаются так: TreeView1.Items[0].

MultiSelect - если True, то разрешает одновременное выделение нескольких узлов; если False - запрещает.
MultiSelectStyle - переключатели, которые определяют способ выделения нескольких узлов. Переключателей четыре, если они имеют значение True, то данный способ работает, иначе не работает:
  • msControlSelect - с нажатой и удерживаемой <CTRL>, когда щелкают по элементам списка в произвольном порядке.
  • msShiftSelect - с нажатой и удерживаемой <SHIFT>, когда выбирают сразу диапазон элементов, щелкая сперва по первому, затем по последнему элементу.
  • msSiblingOnly - как msShiftSelect, но в диапазон включаются только узлы одного уровня.
  • msVisibleOnly - как msShiftSelect, но в диапазон не включаются нераскрытые дочерние узлы.
RightClickSelect - при True узлы выделяются как левой, так и правой кнопкой мыши; при False - только левой.
RowSelect - при True выделяется вся строка элемента, при False - только его имя. Бесполезное свойство, надо сказать.
ScrollBars - полосы прокрутки, с ними вы знакомы по компоненту TMemo. Рекомендую устанавливать в этом свойстве значение ssAutoBoth.
ShowButtons - разрешает (при True) или запрещает показ кнопок возле узлов. Обычно разрешает, тогда слева от закрытого узла будет кнопка с плюсом, от открытого - с минусом.
ShowLines - разрешает показ линий ветвей дерева. Желательно оставлять True.
ShowRoot - разрешает показ линии, идущей от корня дерева. Если ShowLines = False, то никаких линий не будет показано в любом случае.
SortType - способ сортировки списка. К этому свойству мы еще вернемся в программе. Может быть:
  • stNone - нет сортировки.
  • stText - сортировка по тексту.
  • stData - сортировка по данным.
  • stBoth - сортировка и по тексту, и по данным.

TreeLineColor и TreeLinePenStyle отвечают за цвет и тип линий ветвей дерева.

Методы TTreeView

AlphaSort - еще один способ отсортировать список. Вызывается так:
TreeView1.AlphaSort;
        
Метод возвращает True, если сортировка прошла успешно, и False в другом случае.
FullCollapse - сворачивает дерево, скрывая все его дочерние узлы.
FullExpand - наоборот, разворачивает дерево.
LoadFromFile - метод считывает информацию об узлах из текстового файла. Файл сохраняется в формате UTF-8. Дочерние узлы находятся ниже родительских, и сдвинуты вправо символом табулятора. Перед использованием желательно проверять реальное наличие файла.
SaveToFile - наоборот, сохраняет структуру дерева в текстовый файл.

События TTreeView

Компонент имеет несколько специфичных событий, которые могут оказаться полезными.

OnChange - возникает после перемещения на другой узел.
OnChanging - возникает перед перемещением на другой узел. При желании, можно сгенерировать это событие, и запретить пользователю этот переход, например, если не выполнено какое-то условие.
OnCollapsed - возникает после свертывания узла. Пользователь может вызвать это событие, щелкнув по кнопке "-" рядом с узлом.
OnCollapsing - возникает после свертывания узла.
OnCompare - возникает, когда обработчик при сортировке списка сравнивает два узла и решает, который должен быть выше.
OnDeletion - возникает при удалении узла.
OnEdited - возникает после редактирования пользователем надписи узла.
OnEditing - возникает во время редактирования надписи узла.
OnExpanded - возникает после разворачивания узла.
OnExpanding - возникает перед разворачивания узла.
OnGetImageIndex - возникает при определении индекса изображения у узла из связанного TImageList.
OnGetSelectedIndex - возникает при определении индекса текущего узла.
Инга Готфрид
Инга Готфрид
Александр Скрябнев
Александр Скрябнев

Через WMI, или используя утилиту wmic? А может есть еще какие более простые пути...