160______________________________________________Глава 3

Ряд событий компонента TreeView связан с развертыванием и свертыванием
узлов. При развертывании узла происходят события OnExpanding (перед развер-
тыванием) и OnExpanded (после развертывания). В обработчики обоих событий пе-
редается параметр TTreeNode *Node — развертываемый узел. Кроме того в обра-
ботчик OnExpanding передается параметр bool &AllowExpansion, который можно
задать равным false, если желательно запретить развертывание. При свертывании
узла происходят события OnCollapsing (перед свертыванием) и OnCollapsed (после
свертывания). Так же, как и в событиях, связанных с развертыванием, в обработ-
чики передается параметр TTreeNode *Node — свертываемый узел, а в обработчик
OnCollapsing дополнительно передается параметр bool &AllowCollapse, разреша-
ющий или запрещающий свертывание.

Свойство ReadOnly компонента TreeView позволяет запретить пользователю
редактировать отображаемые данные. Если редактирование разрешено, то при ре-
дактировании возникают события OnEditing и OnEdited, аналогичные рассмот-
ренным ранее (в обработчике OnEditing параметр bool &AllowEdit позволяет за-
претить редактирование).

Ряд свойств компонента TreeView: ShowButtons, ShowLines, ShowRoot отве-
чают за изображение дерева и позволяют отображать или убирать из него кнопки,
показывающие раскрытия узла, линии, связывающие узлы, и корневой узел. Поэк-
спериментируйте с этими свойствами и увидите, как они влияют на изображение.

Свойство SortType позволяет автоматически сортировать ветви и узлы дерева.
По умолчанию это свойство равно stNone, что означает, что дерево не сортируется.
Если установить SortType равным stText, то узлы будут автоматически сортирова-
» ться по алфавиту. Возможно также проводить сортировку по связанным с узлами
объектам Data (значение SortType равно stData), одновременно по тексту и объек-
там Data (значение SortType равно stBoth) или любым иным способом. Для испо-
льзования этих возможностей сортировки надо написать обработчик события Оп-
Compare, в который передаются, в частности, параметры TTreeNode *Nodel и
TTreeNode *Node2 — сравниваемые узлы, и параметр int &Compare, в который
надо заносить результат сравнения: отрицательное число, если узел Nodel должен
располагаться ранее Node2, 0, если эти узлы считаются эквивалентными, и поло-
жительное число, если узел Nodel должен располагаться в дереве после Node2.
Например, следующий оператор в обработчике события OnCompare обеспечивает
обратный алфавитный порядок расположения узлов:

Compare = — AnsiStrIComp(Nodel->Text.c_str(), Node2->Text.c_str()) ;

События OnCompare наступают после задания любого значения SortType, от-
личного от stNone и при изменении пользователем свойств узла (например, при ре-
дактировании им надписи узла), если значение SortType не равно stNone. После
сортировки первоначальная последовательность узлов в дереве теряется. Поэтому
последующее задание SortType = stNone не восстанавливает начальное располо-
жение узлов, но исключает дальнейшую генерацию событий OnCompare, т.е. авто-
матическую перестановку узлов, например, при редактировании их надписей.
Если же требуется изменить характер сортировки или провести сортировку с уче-
том новых созданных узлов, то надо сначала задать значение SortType = stNone, а
затем задать любое значение SortType, отличное от stNone. При этом будут сгене-
рированы новые обращения к обработчику событий OnCompare.

Имеются и другие возможности сортировки. Например, метод Alpha-
Sort(void) обеспечивает алфавитную последовательность узлов независимо от зна-
чения SortType, но при отсутствии обработчика событий OnCompare (если обра-
ботчик есть, то при выполнении метода AlphaSort происходит обращение к этому
обработчику). Отличие метода AlphaSort от задания значения SortType = stText
заключается в том, что изменение надписей узлов приводит к автоматической пе-
ресортировке дерева только при SortType •= stText.