Исходники.Ру - Программирование
Исходники
Статьи
Книги и учебники
Скрипты
Новости RSS
Магазин программиста

Ishodniki.Ru » Online книги » C++ Builder по шагам

Шаг 65 - Компонент TTreeView

 

Компонентный класс gif/65_1.gif (152 b), инкапсулировавший элемент управления - дерево. Это, например, левая сторона 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) уровня.

Вот пример такого дерева:

gif/65_2.gif (1549 b)

Как я и говорил, иконки можно взять одинаковые с проводником. На рисунке два узла высшего уровня, у первого из них имеются три потомка.

Список, содержащий все топ узлы, представляется свойством Items и является объектом класса TTreeNodes. Вкратце про него. Он прдоставляет возможности добавления нод любого уровня.

TTreeNodes

Здесь его основные методы...

  • Add, AddFirst, AddObject, AddObjectFirst
Описание:
TTreeNode* __fastcall Add(TTreeNode* Node, const System::AnsiString S);
TTreeNode*__fastcall AddFirst(TTreeNode* Node, const System::AnsiString S);
TTreeNode* __fastcall AddObject(TTreeNode* Node, const System::AnsiString S, void * Ptr);
TTreeNode* __fastcall AddObjectFirst(TTreeNode* Node, const System::AnsiString S, void * Ptr);

Три функции, вроде разные, а делают в общем-то одно и то же. Первая добавляет узел сразу после Node параметра, с подписью S. Вторая ноду того же уровня что и Node параметр, но самой первой. Следующие две аналогичны первым двум, но в дополнение к этому добавляют к ноде указатель Ptr (свойство Data) на произвольный объект. Все функции типа Add_* возвращают указатель на новую ноду.

 

  • AddChild, AddChildFirst
    Описание:
    TTreeNode* __fastcall AddChild(TTreeNode* Node, const System::AnsiString S);
    TTreeNode* __fastcall AddChildFirst(TTreeNode* Node, const System::AnsiString S);

    AddChild добавляет новую ноду как последнего потомка параметра Node. AddChildFirst наоборот - как первого потомка...

     

  • AddChildObject, AddChildObjectFirst
     

    Даже описание приводить не хочется :(... Все то же самое, как и AddObject, AddObjectFirst, только относится к мозданию потомка...

     

  • BeginUpdate, EndUpdate
    Описание:
    void __fastcall BeginUpdate(void);
    void __fastcall EndUpdate(void);

    Пара методов, повышающих эффективность использования этого элемента. Бывают случаи, когда проводятся массовые операции над узлами дерева. Ну, если рассматривать пример просмотра файлов (выше), это когда считывается директория. По умолчанию, при добавлении или модификации нод дерево автоматически перерисовывается, его свойства перезагружаются заново. Если файлов 10, то не страшно. А если 100? 1000?... Ну вот. При вызове BeginUpdate экран не перерисовывается, пока не будет вызван метод EndUpdate. Одно замечание. Сколько раз был вызван метод BeginUpdate, соответственно столько же раз должен быть вызван EndUpdate.

     

  • Clear
    Вообще логично :). Удаляет все ноды дерева. Интересно, что здесь еще можно подумать...

     

  • Delete
    Описание:
    void __fastcall Delete(TTreeNode* Node);

    Удаляет выбранный узел дерева, определенный указателем Node.

     

  • GetFirstNode, GetNode
    Описание:
    TTreeNode* __fastcall GetFirstNode(void);
    TTreeNode* __fastcall GetNode(HTREEITEM ItemId);

    Первый метод возвращает указатель на самый первой узел дерева. Второй выдает указатель по параметру - дескриптору элемента дерева.

     

  • Insert, InsertObject
    Описание:
    TTreeNode* __fastcall Insert(TTreeNode* Node, const AnsiString S);
    TTreeNode* __fastcall InsertObject(TTreeNode* Node, const System:: AnsiString S, void * Ptr);

    Insert вставляет новую ноду непосредственно перед нодой, указанной параметром Node. InsertObject еще и добавляет ко всему этому безобразию :) указатель на область памяти. Как обычно, параметр S определяет подпись узла.

    Хм... Это было много. Наверное. На свойства осталось мало, их всего четыре. Owner и Hadnle обозначают соответственно владеющий объект и его дескриптор. Item - свойство типа массив, содержит указатели на элементы верхнего уровня. Count - количество всех элементов, которые содержит данный объект TTreeView. То есть не только top-level, но и вложенных.

    Я думаю, никто не против, если мы продолжим в следующем шаге?

  • Предыдущий шаг | Оглавление | Следующий шаг

    Рассылка новостей
    Рейтинги
    © 2007, Программирование Исходники.Ру