Компоненты TTreeView и TListView
Внешний вид компонента TTreeview может быть весьма основательно настроен под нужды пользователя. Свойство showButtor.s отвечает за то, будут ли отображаться кнопки со знаком "+" и "-" перед узлами, имеющими "потомство" (дочерние узлы). Щелчок на этих кнопках позволяет сворачивать/разворачивать дерево дочерних узлов. В противном случае делать это нужно двойным щелчком на узле или установить свойство AutoExpand в значение True – тогда сворачивание и разворачивание будет происходить автоматически при выделении узлов. Свойство showLines определяет, будут ли родительские и дочерние узлы соединяться видимыми линиями. Аналогично, свойство showRoot определяет, будут ли на рисунке соединяться между собой линиями корневые узлы (если их несколько). При помощи свойства HotTrack можно динамически отслеживать положение текущего узла: если оно установлено в значение True, то текущий узел (не выделенный, а именно текущий – тот, над которым находится курсор мыши) подчеркивается синей линией.
Наконец, для оформления дерева можно использовать наборы картинок. Наборов два – в свойствах images и stateimages. Напомним, что у каждого узла-объекта TTreeNode есть свойства Imagelndex и Statelndex, а вдобавок еще и seiectedindex. Первая картинка предназначена для отображения типа узла, а вторая – его состояния. Можно сразу (при добавлении) указать номера изображений для того или иного случая, а можно делать это динамически. Для этого существуют события:
type TTVExpandedEvent = procedure(Sender: TObject; Node: TTreeNode)of object; property OnGetlmagelndex: TTVExpandedEvent; property OnGetSelectedlndex: TTVExpandedEvent;
Пример их использования дан в листинге 5.1 ниже – в момент возникновения этих событий следует переопределить свойство imageindex или Seiectedindex передаваемого в обработчик события объекта TTreeNode.
Свойства stateindex и stateimages можно порекомендовать для имитации множественного выбора. Дело в том, что в отличие от TListview, в TTreeView невозможно одновременно выбрать несколько узлов. Вы можете отслеживать щелчки на узлах, и для выбранных устанавливать значение stateindex в 1; под этим номером в stateimages поместите, например, галочку.
Изложенная информация будет неполной, если не рассказать, на какие события реагирует компонент TTreeView. Большинство из них происходит парами – до наступления какого-то изменения и после него. К примеру, возникновение события onChanging означает начало перехода фокуса от одного узла к другому, a Onchange – его завершение.
Четверка событий:
type TTVCollapsingEvent = procedure(Sender: TObject; Node: TTreeNode; var AllowCollapse: Boolean) of object; type TTVExpandingEvent = procedure(Sender: TObject; Node: TTreeNode; var AllowExpansion: Boolean) of object; property OnExpanding: TTVExpandingEvent; property OnExpanded: TTVExpandedEvent; property OnCollapsing: TTVCollapsingEvent; property OnCollapsed: TTVExpandedEvent;
Сопровождает процесс свертывания/развертывания узла, а пара:
type TTVEditingEvent = procedure(Sender: TObject; Node: TTreeNode; var AllowEdit: Boolean) of object; property OnEditing: TTVEditingEvent; type TTVEditedEvent = procedure(Sender: TObject; Node: TTreeNode; var S: string) of object; property OnEdited: TTVEditedEvent;
Сопровождает редактирование его текста. Событие onDeletion происходит при удалении узла. Иногда нужно сравнивать узлы между собой – если вы хотите сделать это по своим правилам, используйте событие oncompare.
Наконец, те, кому и приведенных возможностей мало, могут сами рисовать на компоненте TTreeView. У него есть свойство Canvas и четыре события – OnCustomDraw, OnCustomDrawItem, OnAdvancedCustomDraw, OnAdvancedCustomDrawItem.
Перейдем теперь к компоненту TListview. Его еще называют расширенным списком. Действительно, в этот компонент заложено столько, что он перекрывает все мыслимые и немыслимые задачи по отображению упорядоченной однородной информации.
Начнем со свойства viewstyie:
type TViewStyle = (vslcon, vsSmalllcon, vsList, vsReport); property ViewStyle: TViewStyle;