Исходники
Статьи
Языки программирования
.NET Delphi Visual C++ Borland C++ Builder C/С++ и C# Базы Данных MySQL MSSQL Oracle PostgreSQL Interbase VisualFoxPro Веб-Мастеру PHP HTML Perl Java JavaScript Протоколы AJAX Технология Ajax Освоение Ajax Сети Беспроводные сети Локальные сети Сети хранения данных TCP/IP xDSL ATM Операционные системы Windows Linux Wap Книги и учебники
Скрипты
Магазин программиста
|
Ishodniki.Ru » Online книги » C++ Builder по шагам Шаг 65 - Компонент TTreeView
Компонентный класс , инкапсулировавший элемент управления - дерево. Это, например, левая сторона 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. Вкратце про него. Он прдоставляет возможности добавления нод любого уровня. TTreeNodesЗдесь его основные методы...
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_* возвращают указатель на новую ноду.
TTreeNode* __fastcall AddChild(TTreeNode* Node, const System::AnsiString S); TTreeNode* __fastcall AddChildFirst(TTreeNode* Node, const System::AnsiString S); AddChild добавляет новую ноду как последнего потомка параметра Node. AddChildFirst наоборот - как первого потомка...
Даже описание приводить не хочется :(... Все то же самое, как и AddObject, AddObjectFirst, только относится к мозданию потомка...
void __fastcall BeginUpdate(void); void __fastcall EndUpdate(void); Пара методов, повышающих эффективность использования этого элемента. Бывают случаи, когда проводятся массовые операции над узлами дерева. Ну, если рассматривать пример просмотра файлов (выше), это когда считывается директория. По умолчанию, при добавлении или модификации нод дерево автоматически перерисовывается, его свойства перезагружаются заново. Если файлов 10, то не страшно. А если 100? 1000?... Ну вот. При вызове BeginUpdate экран не перерисовывается, пока не будет вызван метод EndUpdate. Одно замечание. Сколько раз был вызван метод BeginUpdate, соответственно столько же раз должен быть вызван EndUpdate.
void __fastcall Delete(TTreeNode* Node); Удаляет выбранный узел дерева, определенный указателем Node.
TTreeNode* __fastcall GetFirstNode(void); TTreeNode* __fastcall GetNode(HTREEITEM ItemId); Первый метод возвращает указатель на самый первой узел дерева. Второй выдает указатель по параметру - дескриптору элемента дерева.
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, но и вложенных. Я думаю, никто не против, если мы продолжим в следующем шаге? |
Форум Программиста
Новости Обзоры Магазин Программиста Каталог ссылок Поиск Добавить файл Обратная связь
https://woodcort.ru купить деревянные окна из дуба.
Рейтинги
|