Принципы объектно-ориентированного визуального программирования_____57

может выдать текст «TButton», если Sender указывает на кнопку типа TButton.

Функцию ClassName можно использовать для выполнения каких-то действий
с объектами только одного конкретного класса. Например, оператор

if (String(Sender->ClassName()) == "TLabel")

обеспечивает выполнение неких действий (обозначенных многоточием) только для
объектов класса TLabel.

Для тех же целей может использоваться еще одна функция — ClassNameIs,
объявленная в классе TObject как:

bool   fastcall ClassNameIs(const AnsiString string);

Эта функция возвращает true, если класс объекта совпадает с заданным пара-
метром string. При использовании этой функции приведенный выше пример при-
обретает вид:

if (Sender->ClassNameIs("TLabel"))

В приведенных ранее примерах использования свойств и методов класса, к ко-
торому приводится указатель на класс-предшественник, вас может подстерегать
некая опасность. Выше был приведен пример масштабирования компонента с ис-
пользованием метода ScaleBy, объявленного в классе TWinControl. Но если ис-
тинный класс объекта, на который указывает Sender, окажется не потомком клас-
са TWinControl (например, меткой TLabel, которая не наследует TWinControl), то
метод ScaleBy не сработает. Еще более неприятные и непредсказуемые результаты
получатся, если вы обратитесь к свойству, отсутствующему у компонента.

Поэтому, если нет уверенности, что применяемый метод или свойство имеется
в обрабатываемом объекте, надо предварительно проверить, является ли класс
объекта потомком того класса, в котором требуемый метод или свойство объявле-
ны. Например, прежде, чем применять метод ScaleBy, надо убедиться, что класс
объекта является потомком TWinControl.

Для этих целей можно воспользоваться методом InheritsFrom, объявленным в
классе TObject и, следовательно, имеющимся в любых компонентах. Объявление
этого метода:

bool _fastcall InheritsFrom(TClass aClass);

Метод возвращает true, если класс данного объекта является потомком класса
aClass, указываемого как параметр метода. Этот параметр имеет тип TClass, кото-
рый может создаваться операцией _classid:

_classid(classType)

Аргументом этой операции является обычное имя класса, например, TWin-
Control.

Таким образом, проверка, является ли класс объекта, на который указывает
Sender, потомком TWinControl, может осуществляться оператором:

if (Sender->Inheri'tsFrom(_classid (TWinControl) ) )

С учетом этого приведенный ранее пример масштабирования методом ScaleBy
оконных компонентов более грамотно должен осуществляться следующим опера-
тором:

if (Sender->InheritsFrom(_classid(TWinControl)))
((TWinControl *)Sender)->ScaleBy(11,10);

Еще одна функция — ClassParent, объявленная в классе TObject, возвращает
класс, являющийся непосредственным предком класса данного объекта. Функция
объявлена как:

TCiass _fastcall ClassParent()