Составители:
Рубрика:
40
TOutline создан для ведения и отображения иерархических структур данных — деревьев. Это
один из наиболее сложных и интересных компонентов. В этот раздел он попал потому, что является
потомком таблицы (TCustomGrid), хотя и мало чем ее напоминает.
Типичным примером применения TOutline можно назвать отображение структуры файловой
системы (для этого даже есть отдельный компонент TDirectory Outline). В описанном
ниже примере
OBJTREE этот компонент используется для отображения дерева классов библиотеки VCL.
Дерево состоит из элементов (будем называть их узлами), упорядоченных по уровням. Каждый
из них имеет родительский узел (на более высоком уровне) и список дочерних узлов-потомков. Исклю-
чением являются корневой узел (нулевого уровня) — он не имеет предка, и узлы последнего
уровня, не
имеющие потомков.
Каждый узел является объектом класса TOutlineNode:
TOutlineNode = class(TPersistent) Рассмотрим сначала методы и свойства этого объекта. С каж-
дым узлом можно связать информацию — имя и произвольные данные:
property Text: string;
property Data: Pointer;
Указатель на родительский узел определяется свойством:
(Ro) property Parent: TOutlineNode;
Если список дочерних узлов не пуст, что можно проверить при помощи свойства
(Ro) property Hasltems: Boolean;
то для получения информации
о них есть метода,!:
function GetFirstChild: Longint;
function GetLastChild: Longint;
function GetNextChild(Value: Longint): Longing-function GetPrevChiId(Value: Longint): Longint;
В последних двух методах параметр Value содержит индекс предыдущего найденного потомка.
Индекс — это уникальный идентификатор узла в дереве, определенный свойством:
(Ro) property Index: Longint;
Используя его, можно получить указатель на узел (см. ниже сам компонент TOutline). Узлы
пронумерованы таким образом, что если родитель имеет номер N, то первый из его потомков — номер
(N+1).
Можно узнать и полное имя (путь) узла, представляющее собой конкатенацию всех родитель-
ских имен и имени узла, разделенных специальным символом. Этот символ определен в свойстве Item-
Separator объекта TCustomOutline, которому принадлежат узлы. Полный путь определяется свойством:
(Ro) property FullPath: string;
Каждый узел расположен на своем иерархическом уровне. На самом верху находится узел
уровня 0. Все другие являются для
пего дочерними; он не виден и не доступен пользователю. Поэтому
на первом доступном уровне — с номером 1 — могут находиться по вашему желанию один или не-
сколько узлов. Уровень иерархии узла можно узнать в его свойстве:
(
RO) property Level: Cardinal;
Чтобы изменить уровень, надо вызвать метод:
procedure ChangeLevelBy(Value: TChangeRange);
которьш перемещает узел в список другого уровня. Диапазон перемещения TChangeRange ог-
раничен:
TChangeRange = -1..1;
Чтобы переместить узел в дереве, нужно вызвать следующий метод
procedure MoveTo(Destination: Longint; AttachMode: TAttachMode);
TAttachMode = (oaAdd, oaAddChild, oalnsert) ;
Он перемещает узел (вместе со всеми потомками) в положение с индексом Destination. Роди-
тельский узел не может переместиться на место любого из
своих потомков. Режим перемещения At-
tachMode означает:
oaAdd — добавить последним на том же уровне, что и Destination;
oaAddChild — добавить последним к потомкам узла Destination;
oalnsert — заменить в положении Destination прежний узел, которьш смещается дальше по спи-
TOutline создан для ведения и отображения иерархических структур данных — деревьев. Это один из наиболее сложных и интересных компонентов. В этот раздел он попал потому, что является потомком таблицы (TCustomGrid), хотя и мало чем ее напоминает. Типичным примером применения TOutline можно назвать отображение структуры файловой системы (для этого даже есть отдельный компонент TDirectory Outline). В описанном ниже примере OBJTREE этот компонент используется для отображения дерева классов библиотеки VCL. Дерево состоит из элементов (будем называть их узлами), упорядоченных по уровням. Каждый из них имеет родительский узел (на более высоком уровне) и список дочерних узлов-потомков. Исклю- чением являются корневой узел (нулевого уровня) — он не имеет предка, и узлы последнего уровня, не имеющие потомков. Каждый узел является объектом класса TOutlineNode: TOutlineNode = class(TPersistent) Рассмотрим сначала методы и свойства этого объекта. С каж- дым узлом можно связать информацию — имя и произвольные данные: property Text: string; property Data: Pointer; Указатель на родительский узел определяется свойством: (Ro) property Parent: TOutlineNode; Если список дочерних узлов не пуст, что можно проверить при помощи свойства (Ro) property Hasltems: Boolean; то для получения информации о них есть метода,!: function GetFirstChild: Longint; function GetLastChild: Longint; function GetNextChild(Value: Longint): Longing-function GetPrevChiId(Value: Longint): Longint; В последних двух методах параметр Value содержит индекс предыдущего найденного потомка. Индекс — это уникальный идентификатор узла в дереве, определенный свойством: (Ro) property Index: Longint; Используя его, можно получить указатель на узел (см. ниже сам компонент TOutline). Узлы пронумерованы таким образом, что если родитель имеет номер N, то первый из его потомков — номер (N+1). Можно узнать и полное имя (путь) узла, представляющее собой конкатенацию всех родитель- ских имен и имени узла, разделенных специальным символом. Этот символ определен в свойстве Item- Separator объекта TCustomOutline, которому принадлежат узлы. Полный путь определяется свойством: (Ro) property FullPath: string; Каждый узел расположен на своем иерархическом уровне. На самом верху находится узел уровня 0. Все другие являются для пего дочерними; он не виден и не доступен пользователю. Поэтому на первом доступном уровне — с номером 1 — могут находиться по вашему желанию один или не- сколько узлов. Уровень иерархии узла можно узнать в его свойстве: (RO) property Level: Cardinal; Чтобы изменить уровень, надо вызвать метод: procedure ChangeLevelBy(Value: TChangeRange); которьш перемещает узел в список другого уровня. Диапазон перемещения TChangeRange ог- раничен: TChangeRange = -1..1; Чтобы переместить узел в дереве, нужно вызвать следующий метод procedure MoveTo(Destination: Longint; AttachMode: TAttachMode); TAttachMode = (oaAdd, oaAddChild, oalnsert) ; Он перемещает узел (вместе со всеми потомками) в положение с индексом Destination. Роди- тельский узел не может переместиться на место любого из своих потомков. Режим перемещения At- tachMode означает: oaAdd — добавить последним на том же уровне, что и Destination; oaAddChild — добавить последним к потомкам узла Destination; oalnsert — заменить в положении Destination прежний узел, которьш смещается дальше по спи- 40
Страницы
- « первая
- ‹ предыдущая
- …
- 38
- 39
- 40
- 41
- 42
- …
- следующая ›
- последняя »