Если необходимо рассмотреть свойство или применить к объекту метод, который объявлен в классах-наследниках, то необходимо привести тип указателя к тому классу, где это свойство или метод имеются.
Свойство Name есть у всех компонент библиотеки VCL и объявлено оно в классе TСomponent. Выражение ((TСomponent *)Sender) является приведением типа параметра Sender к типу указателя на объект класса TСomponent. Теперь можно узнать имя компонента:
Label1->Caption = ((TСomponent *)Sender) -> Name;
или
TComponent *Obj;
Obj = ((TСomponent *)Sender);
Теперь переменную Obj можно использовать как указатель на компонент:
Label1->Caption = Obj -> Name;
Часто программисту необходимо узнать является ли класс объекта потомком того класса, методы и свойства которого мы хотим использовать. Это можно проверить с помощью метода InheritsFrom, объявленного в TObject и возвращающего логический результат. Например, можно убедиться, что объект наследует свойства класса TWinControl:
if (Sender -> InheritsFrom(__classid(TWinControl)))
. . . ;
оператор __сlassid(classType) используется компилятором для генерации ссылки на указанный класс, в данном примере на класс TWinControl.
Определение истинного класса объекта
В классе TObject определен метод ClassName(), возвращающий строку, содержащую действительный класс объекта. Имя класса можно, например, увидеть на экране:
Label1 -> Caption = Sender-> ClassName();
Или программно проверить принадлежность к интересующему нас классу:
if (String (Sender -> ClassName()) == “TShape”)
. . . ;
Для такой же проверки можно использовать функцию ClassNameIs, определенную в TObject и возвращающую результат типа bool.
If (Sender -> ClassNameIs(“TShape”) )
. . . ;
|