Метод ClassParent, определенный в TObject позволяет определить класс, являющийся непосредственным предком класса заданного объекта. Если это объект класса TObject, то есть класс не имеет предков, то вернется NULL.
Для восстановления всей иерархии классов некоторого объекта следует использовать данный метод в цикле. На рис. 2.1 представлено главное окно приложения, которое в компоненте TreeView, предназначенном для отображения иерархических данных в виде дерева, отображает иерархию классов указанного объекта. Сами объекты (Edit1, Shape1, Button1 и Image1) также расположены в этом окне, а слева от них указаны имена классов объектов.
В программе использована технология Drag-and-Drop. Пользователь “перетаскивает” объект на компонент TreeView1 и, получив указатель на объект-источник информации, метод TreeView1DragDrop в цикле считывает имена классов объекта.
void __fastcall TForm1::TreeView1DragDrop(TObject *Sender, TObject *Source,
int X, int Y)
{
// Получение ссылки на класс объекта
TClass ClassRef = Source->ClassType();
if (Sender->ClassNameIs("TTreeView"))
{
// Получение указателя на объект TreeView1
TTreeView *pTV = (TTreeView *)Sender;
// Удаление предыдущей информации из TreeView1
while (pTV->GetNodeAt(0,0)!=NULL)
pTV->Items->Delete(pTV->GetNodeAt(0,0));
}
// Имена родительских классов добавляются в первый // узел дерева
while (ClassRef!=NULL)
{
TreeView1->Items->AddFirst(TreeView1->
GetNodeAt(0,0),ClassRef->ClassName());
ClassRef = ClassRef->ClassParent();
}
Label1->Caption ="Источник: " + (AnsiString)
(( TComponent *) Source)->Name;
}
Следующий код обработчика события OnDragOver определяет будет ли принят объект-источник компонентом TreeView1.
void __fastcall TForm1::TreeView1DragOver(TObject *Sender, TObject *Source,
int X, int Y, TDragState State, bool &Accept)
{ if (Source!=Sender)
Accept=true;
else
Accept=false;
}
Обработчик события OnEndDrag исходного объекта проверяет принят ли объект каким-либо целевым объектом..
Void __fastcallTForm1::ObjectEndDrag
(TObject*Sender, TObject *Target,
int X, int Y)
{
if (Target==NULL)
Label2->Caption="Нет целевого объекта";
else
Label2->Caption ="Приемник " + (AnsiString)
(( TComponent *) Target)->Name;
}
|