C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 65 - Компонент TTreeView / С++ Builder 5 / Borland C++

Шаг 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, но и вложенных.

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


| |
Автор Аванесов Самвел.
[AD]