Компонентный класс , инкапсулировавший элемент управления - дерево. Это, например, левая сторона Explorera. Правда, надо кое-что отметить касательно именно окон типа TreeView и ListView в Эксплорере и вообще - в "Моем компьютере", диалогах Common, и т.п. Они не являются объектами TreeView или ListView, и даже не элементами управления LISTVIEW и TREEVIEW. Это так называемые системные списки - SysListView, SysTreeView. Они не предоставляют прямой доступ к себе посредством DLL или API-вызовов. Так что приходится при необходимости создавать самим подобные классы. Занятие трудоемкое - в плане описания всплывающих меню, доступа к файл-информации, а самое сложное - эффективность... Если кто обращал внимание, при просмотре иконки подгружаются динамически. Иначе считывание папки занимает довольно долгое время.
Вообще этим - контекстными меню, иконками (большими и малыми) файлов, ведает раздел функций API - shell extension или shell's namespace functions. Они предоставляют доступ также и к "подшивкам свойств" (property sheets) объектов. Но - это предмет отдельного изучения. Скорее всего, в следующих шагах, на примере создания компонента, инкапсулирующего эти возможности, я рассмотрю все это подробнее.
Ну, а теперь собственно про TreeView. Составной частью древовидного списка является node - лист дерева. Эта node может иметь потомков (childs) или иметь родителя (parent). Впрочем, и того и другого может и не быть. В последнем случае такая node ( по-русски, наверное, ближе всего будет понятие "узел") является нодой самого высшего (top-level) уровня.
Вот пример такого дерева:
Как я и говорил, иконки можно взять одинаковые с проводником. На рисунке два узла высшего уровня, у первого из них имеются три потомка.
Список, содержащий все топ узлы, представляется свойством Items и является объектом класса TTreeNodes. Вкратце про него. Он прдоставляет возможности добавления нод любого уровня.
Здесь его основные методы...
Три функции, вроде разные, а делают в общем-то одно и то же. Первая добавляет узел сразу после Node параметра, с подписью S. Вторая ноду того же уровня что и Node параметр, но самой первой. Следующие две аналогичны первым двум, но в дополнение к этому добавляют к ноде указатель Ptr (свойство Data) на произвольный объект. Все функции типа Add_* возвращают указатель на новую ноду.
AddChild добавляет новую ноду как последнего потомка параметра Node. AddChildFirst наоборот - как первого потомка...
Даже описание приводить не хочется :(... Все то же самое, как и AddObject, AddObjectFirst, только относится к мозданию потомка...
Пара методов, повышающих эффективность использования этого элемента. Бывают случаи, когда проводятся массовые операции над узлами дерева. Ну, если рассматривать пример просмотра файлов (выше), это когда считывается директория. По умолчанию, при добавлении или модификации нод дерево автоматически перерисовывается, его свойства перезагружаются заново. Если файлов 10, то не страшно. А если 100? 1000?... Ну вот. При вызове BeginUpdate экран не перерисовывается, пока не будет вызван метод EndUpdate. Одно замечание. Сколько раз был вызван метод BeginUpdate, соответственно столько же раз должен быть вызван EndUpdate.
Удаляет выбранный узел дерева, определенный указателем Node.
Первый метод возвращает указатель на самый первой узел дерева. Второй выдает указатель по параметру - дескриптору элемента дерева.
Insert вставляет новую ноду непосредственно перед нодой, указанной параметром Node. InsertObject еще и добавляет ко всему этому безобразию :) указатель на область памяти. Как обычно, параметр S определяет подпись узла.
Хм... Это было много. Наверное. На свойства осталось мало, их всего четыре. Owner и Hadnle обозначают соответственно владеющий объект и его дескриптор. Item - свойство типа массив, содержит указатели на элементы верхнего уровня. Count - количество всех элементов, которые содержит данный объект TTreeView. То есть не только top-level, но и вложенных.
Я думаю, никто не против, если мы продолжим в следующем шаге?