18.3.12. TTreeView - дерево иерархии

Компонент TTreeView служит для показа ветвящихся иерархических структур, таких как дерево наследования объектов или файловая структура диска. Он содержит связанные узлы, каждый из которых может содержать пиктограмму, текст и произвольный объект (подобно спискам TStringList - см. п. 14.3.2). Любой узел может иметь собственный список подузлов (рис. 18.27), которые можно раскрывать или закрывать щелчком мыши на пиктограмме узла.

Рис. 18.27. Пример использования компонента TTreeView

Для наполнения списка на этапе конструирования программы нужно щелкнуть по компоненту правой кнопкой мыши и выбрать Items Editor., либо щелкнуть по нему дважды, либо, наконец, щелкнуть по кнопке в свойстве Items - во всех случаях на экране появится окно редактора компонента (рис. 18.28).

Рис. 18.28. Редактор компонента

Чтобы начать наполнение, щелкните по кнопке New item и введите связанный с узлом текст в поле Text. С помощью image index панели item properties устанавливается индекс связанной с узлом пиктограммы, с помощью selected index - индекс пиктограммы для выбранного узла. Для ввода подузла любого уровня сначала нужно щелкнуть в окошке Items по узлу, который должен стать родительским, и лишь затем - на кнопке New subitem.

Для ввода списка в режиме прогона программы широко используется центральное свойство компонента - items типа TTreeNodes, открывающее индексированный доступ ко всем узлам списка. Каждый узел описывается классом TTreeNode, имеющим свои собственные методы и свойства. В частности, его свойство item содержит список всех подузлов данного узла; с помощью многочисленных методов свойства TTreeview. items к этому списку можно добавить новый подузел, а с помощью метода TTreeNode. MoveTo - переместить узел в любую позицию дерева иерархии.

Следующий обработчик события oncreate формы создал рис. 18.29:

procedure TForm1.PormCreate(Sender: TObject) ;

var

k: Integer;

begin with TreeViewl do

begin

// Добавляем корневой узел

Items.Add (NIL,' Корень') ;

//Добавляем 10 вложенных узлов

for k := 1 to 10 do

Items.AddChild(Items[k-1],IntToStr(k))

end

end;

Puc. 18.29. Создание подузлов на этапе прогона программы

Свойства компонента TTreeview:

lean;TBorderStyle = bsNone..bsSingle; property BorderStyle: TBorderStyle; | Определяет стиль рамки, охватывающей компонент: bsNone - нет рамки; bsSingle - рамка толщиной в 1 пиксель
property ChangeDelay: Integer; | Указывает задержку (в миллисекундах) перед раскрытием узла
property DropTarget: TTreeNode; | Указывает узел, который может служить приемником операций Drag&Drop
property HideSelection:Boolean; | Указывает, будет ли убираться выделение узлов, когда компонент теряет фокус ввода
property Images: TImageList; | Содержит набор изображений, которые будут использоваться при прорисовке узлов
property Indent: Integer; | Определяет отступ в пикселях от левого угла узла для всех его подузлов
property Items: TTreeNodes; | Открывает доступ к любому узлу по его индексу. Индексация начинается с нуля и соответствует просмотру всех узлов полностью раскрытого списка
property MultiSelect: Boo lean; | Разрешает/запрещает одновременный выбор несколь ких узлов

type TMultiSelectStyles =

(msControlSel-ect, msShift

Select, msVisibleOnly,

msSiblingOnly) ;

TMultiSelectStyle = set

of TMultiSelectStyles;

property MultiSelectStyle:

TMultiSelect-Style default

[msControlSelect];

Определяет способ выбора нескольких узлов: msControiselect - с нажатой и удерживаемой клавишей Ctrl для выбора узлов в произвольном порядке;

msShiftSelect - с нажатой и удерживаемой клавишей Shift для выбора сплошного диапазона;

msVisibleOnly - подобно msShiftSelect, но в диапазон не включаются дочерние нераскрытые узлы; msSiblingOnly - подобно msShiftSelect, но в диапазон включаются только узлы одного уровня

property Readonly: Boolean; | Запрещает/разрешает редактирование надписей в узлах
property RightClickSelect: Boolean; | Разрешает выбор узлов правой кнопкой мыши
property Selected: TTreeNode; | Содержит список всех выбранных узлов или nil, если таких нет
property SelectionCount: Cardinal; | Содержит количество выбранных узлов
property Selections[Index: Integer]: TTreeNode; | Обеспечивает индексированный доступ к выбранным узлам
property RowSelect: Boolean; | Разрешает цветовыделение линий выбранных узлов. Игнорируется, если showLinesFalse
property ShowButfcons: Boolean; | Разрешает/запрещает показ стандартных кнопок раскрытия подузлов. По умолчанию содержит True. Если False, узел раскрывается двойным щелчком мыши
property ShowLines: Boolean; | Разрешает/запрещает показ линий
property ShowRoot: Boolean; | Разрешает/запрещает показ линий, идущих от самого верхнего уровня иерархии. Игнорируется, если ShowLines=False
TSortType = (stNone, stData, stText, stBoth) ; property SortType: TSort Type; | Указывает способ сортировки узлов: stNone - нет сортировки; stData - сортировка по данным; stText - сортировка по тексту надписей; stBoth - сортировка по тексту и по данным. См. также событие OnCompare
property Topitern: , TTreeNode; | Определяет корневой узел
Методы компонента:

function AlphaSort: Boolean; TTVCompare = function (IParamI, lParam2, IParamSort: Longint) Integer stdcall; tfunction CustomSort(SortProc: TTVCompare; Data: Longint): Boolean; | Сортирует узлы по тексту и возвращает True, если сортировка прошла успешно Определяет нестандартную сортировку с помощью функции SortProc. Эта функция должна рассматривать IParamI и lParam2 как объекты TTreeNode и возвращает отрицательное число, если lParaml<lParam2; ноль, если IParamel^lParamS; положительное число, если lParaml>lParam2
procedure FullCollapse; | Прячет все узлы, кроме узлов самого верх него уровня иерархии
Procedure FullExpand; | Показывает все узлы дерева иерархии

function GetNodeAt(X, Y: Integer) : TTreeNode; | Возвращает узел, располагающийся в указанной точке, или nil, если точка не принадлежит ни одному узлу
function IsEditing: Boolea' | Возвращает True, если пользователь редактирует какой-либо узел
procedure LoadPromFile(const FileName: String); | Загружает дерево иерархии из файла
procedure SaveToFile(const File Name: String) ; | Сохраняет в файле дерево иерархии
procedure SaveToStream(Stream: TStream) ; | Сохраняет в потоке данных дерево иерархии события: С компонентом связаны такие
TTVChangedEvent = procedure(Sender: TObject; Node: TTreeNode) of object; property OnChange: TTVChangedE vent; | Возникает при смене состояния выбора у одного из узлов. Node - узел, который изменил состояние
TTVChangingEvent = procedure( Sender: TObject; Node: TTreeNode; var AllowChange: Boolean) of objectproperty OnChangir.g: TTVChang ingEvent; | Возникает перед сменой состояния выбора у одного из узлов. Node - узел, который будет выбран. Обработчик в параметре AllowChange разрешает или запрещает выбор узла
TTVExpandedEvent = procedure( Sender: TObject; Node: TTreeNode) of object;property OnCollapsed: TTVExpand edEvent; | Возникает при закрытии списка подузлов узла Node
TTVCollapsingEvent = procedure( Sender: TObject; Node: TTreeNode; var AllowCollapse: Boolean) of object; property OnCollapsing: TTVCollapsingEvent; | Возникает перед закрытием списка подуз лов узла Node. В параметре AllowCollapse обработчик разрешает или запрещает закрыть список
TTVCompareEvent = procedure( Sender: TObject; Nodel, Node2: TTreeNode; Data: Integer; var Compare: Integer) of object; property OnCompare: TTVCom pareEvent; | Возникает при сравнении двух узлов Nodel И Node2. В параметре Compare обработчик должен вернуть отрицательное число, если Nodel<Node2; ноль, если Model=Node2; положительное число, если Nodel>Node2
TTVExpandedEvent = procedure( Sender: TObject; Node: TTreeNode) of object; property OnDeletion: TTVExpand edEvent; | Возникает при удалении узла Node из дерева иерархии
TTVEditedEvent = procedure(Sender: TObject; Node: TTreeNode; var S: String) of object; property OnEdited: TTVEditedEvent; | Возникает при завершении редактирования надписи в узле Node: S - новая надпись
TTVExpandedEvent = procedure( Sender: TObject; Node: TreeNode) of object; property OnExpanded: TTVExpand edEvent; | Возникает при распахивании списка подузлов узла Node
TTVExpandingEvent = procedure( Sender: TObject; Node: TTreeNode; var AllowExpansion: Boolean) of object; property OnExpanding: TTVExpand ingEvent; | Возникает перед открытием списка подузлов узла Node. В параметре AllowExpansion обработчик разрешает или запрещает открыть список
TTVExpandedEvent = procedure( Sender: TObject; Node: TreeNode) of object;property OnGetImageIndex: TTVEx pandedEvent; | Возникает при необходимости получения индекса изображения для прорисовки узла Node в обычном состоянии
TVExpandedEvent == procedure( Sender: TObject; Node: TTreeNode) of object; property OnGetSelectedIndex: TTVExpandedEvent; | Возникает при необходимости получения индекса изображения для прорисовки узла Node в выбранном состоянии

При программном заполнении списка следует пользоваться свойством TTreeView. Items класса TTreeNodes.

Свойства класса TTreeNodes:

property Count: Integer; property Item[Index: Integer]: TTreeNode; default-property Owner: TCustomTreeView; | Количество узлов, входящих в items Открывает индексированный доступ к узлам Содержит ссылку на родительский список
Методы класса TTreeNodes:

function Add(Node: TTreeNode; const S: String): TTreeNode;

function AddChild(Node: TTreeNode; const S: String): TTreeNode; function AddChildFirst(Node: TTreeNode; const S: String): TTreeNode; function AddChildObject(Node: TTreeNode; const S: String; Ptr: Pointer): TTreeNode;

function AddChildObjectFirst( Node: TTreeNode; const S: String;

Ptr: Pointer): TTreeNode;

Добавляет узел в конец того списка, в котором зарегистрирован узел Node. Если Node=NlL, добавляется корневой узел для всего компонента Добавляет узел в конец списка item дочерних узлов узла Node

Добавляет узел в начало списка Item дочерних узлов узла Node

Добавляет узел и данные в конец списка item дочерних узлов узла Node. На данные ссылается указатель Ptr. Связанная с данными область памяти не освобождается автоматически при уничтожении списка Добавляет узел и данные в начало списка item дочерних узлов узла Node. На данные ссылается указатель Ptr. Связанная с данными область памяти не освобождается автоматически при уничтожении списка

function AddFirst(Node: TTreeNode; const S: String): TTreeNode; | Добавляет узел в начало того списка, в котором зарегистрирован узел Node
function AddObject(Node: TTreeNode; const S: String; Ptr: Pointer): TTreeNode; | Добавляет узел и данные в конец того же списка, в котором зарегистрирован узел Node. На данные ссылается указатель Ptr. Связанная с данными область памяти не освобождается автоматически при уничтожении списка
function AddObjectFirst(Node: TTreeNode; const S: String; Ptr: Pointer): TTreeNode; | Добавляет узел и данные в начало того же списка, в котором зарегистрирован узел Node. На данные ссылается указатель Ptr. Связанная с данными область памяти не освобождается автоматически при уничтожении списка
procedure Assign(Source: TPersistent) ; | Связывает список текущего компонента со списком компонента Source
procedure BeginUpdate; | Блокирует обновление экрана до тех пор, пока не будет выполнен метод EndUpdate. Используется при одновременной вставке нескольких элементов списка для предотвращения мерцания экрана
procedure Clear; | Очищает список всех узлов и подузлов компонента
procedure Delete(Node: TTreeNode); | Уничтожает узел Nods
procedure EndUpdate; | Отменяет действие метода BeginUdate
function GetFirstNode: TTreeNode; | Возвращает самый первый узел в списке Items[0]
function GetNode(Itemid: HTreeItem): TTreeNode; | Возвращает узел по его идентификатору Itemid
function Insert(Node: TTreeNode; const S: String): TTreeNode; | Вставляет узел непосредственно перед узлом Node
function InsertObj ect(Node: TTreeNode; const S: String; Ptr: Pointer): TTreeNode; | Вставляет узел и данные непосредственно перед узлом Node

Как уже отмечалось, каждый узел класса TTreeNode имеет свой набор методов, свойств и событий.

Свойства TTreeNode:

property Absolutelndex: Integer; | Возвращает абсолютный индекс узла (с учетом всех подузлов)
property Count: Integer; | Содержит количество подузлов в списке Item
property Cut: Boolean; | Вырезает узел и помещает его в clipboard
property Data: Pointer; | Указывает на связанные с узлом данные
property Deleting: Boolean; | Содержит True, если для узла вызван De-story
property DropTarget: Boolean; | Содержит True, если узел может служить приемником операции Drag&Drop
property Expanded: Boolean; | Содержит True, если узел распахнут
property Focused: Boolean; | Содержит True, если узел сфокусирован
property HasChildren: Boolean; | Содержит True, если узел имеет дочерние узлы
property Imagelndex: TImageIndex; | Содержит индекс связанной с узлом пиктограммы
property Index: Longint; | Содержит индекс узла в списке дочерних узлов его родительского узла
property IsVisible: Boolean; | Содержит True, если узел виден
property Item[Index: Integer]: TTreeNode; | Открывает индексированный доступ ко всем дочерним узлам
property Itemid: HTreeItem; | Содержит уникальный Windows-дескриптор узла
property Level: Integer; | Содержит иерархический уровень узла
property Overlaylndex: Integers- | Содержит индекс оверлейной пиктограммы. Оверлейная пиктограмма вычерчивается поверх основной, чтобы, например, указать, что узел стал недоступен
property Owner: TTreeNodes; | Содержит ссылку на владельца данного узла
property Parent: TTreeNode; | Содержит ссылку на родительский узел
property Selected: Boolean; | Содержит True, если узел выделен цветом
property Selectedlndex: Integer; | Содержит номер пиктограммы для выделенного узла
property Text: Strings- | Содержит текст узла
property TreeView: TCustomTree- View; | Содержит ссылку на компонент TreeView, к которому принадлежит узел

Методы класса TTreeNode:

function AlphaSort: Boolean; | Сортирует узлы по алфавиту свойств Text и возвращает True в случае успеха
procedure Assign(Source: TPersis tent); override; | Связывает список подузлов с источником Source
procedure Collapse(Recurse: Boolean) ; | Закрывает все узлы (Recource=True) или только распахнутые(Resource=False)
type TTVCompare = function( IParamI, lParam2, IParamSort: Longint): Integer stdcall; func tion CustomSort(SortProc: TTVCom pare; Data: Longint): Boolean; | Реализует нестандартную сортировку узлов
procedure Delete; | Удаляет текущий узел
procedure DeleteChildren; | Удаляет дочерние узлы
function DisplayRect(TextOnly: Boolean): TRect; | Возвращает очерчивающий прямоугольник узла. Если TextOnly=True - возвращает очерчивающий прямоугольник текста
function EditText: Boolean; | Переводит текст узла в режим редактирования
procedure EndEdit(Cancel Boo lean) ; | Заканчивает редактирование текста и со храняет его изменения, если Cancel=False
procedure Expand(Recurse: Boo lean) ; | Открывает узел (и его подузлы, если Recurce=True)
function GetFirstChild: TTreeNode; | Возвращает ссылку на первый подузел или nil, если нет подузлов
function GetLastChild: TTreeNode; | Возвращает ссылку на последний подузел или nil, если нет подузлов
function GetNext: TTreeNode; function GetNextChild(Value: TTreeNode): TTreeNode; | Возвращает ссылку на очередной подузел dозвращает ссылку на подузел после value (или nil, если такового нет).
function GetNextSibling: TTreeNode; | Возвращает ссылку на очередной узел в том же списке.
function GetNextVisible: TTreeNode; | Возвращает ссылку на очередной видимый узел (для которого раскрыты все дочерние узлы)
function GetPrev: TTreeNode; | Возвращает ссылку на предыдущий узел в том же списке независимо от его видимости
function GetPrevChild(Value: TTreeNode): TTreeNode; | Возвращает ссылку на предыдущий по отношению к value дочерний узел
function GetPrevSibling: TTreeNode; | Возвращает ссылку на предыдущий узел того же уровня
function GetPrevVisible: TTreeNode; | Возвращает ссылку на видимый узел того же уровня
function HasAsParent(Value: TTreeNode): Boolean; | Возвращает True, если value - родительский узел
function IndexOf(Value: TTreeNode): Integer; | Возвращает идентификатор узла value
procedure MakeVisible; | Если родительский узел видимый, делает видимыми все дочерние узлы

type TNodeAttachMode = (naAdd,

naAddFirst, naAddChild,

naAddChildFirst, nalnsert) ;

procedure MoveTo(Destination:

TTreeNode; Mode: TNodeAttach

Mode) ;

Перемещает текущий узел в позицию относительно Destination в зависимости от параметра Mode: naAdd - добавляет в конец списка узла того же уровня; naAddFirst -

делает первым в списке узлов того же уровня; naAddchild - добавляет в конец списка

дочерних узлов; naAddChildFirst -делает

первым в списке дочерних узлов; nalnsert

- вставляет непосредственно перед узлом