56_______________________________________________Глава 1

приложение какие-то новые компоненты, то в вашем коде, написанном в общем
виде, ничего не меняется. Новые компоненты автоматически обрабатываются теми
же обработчиками. А если бы вы не использовали такой обобщенный подход, вам
пришлось бы для каждого нового компонента писать новый код.

Не останавливаясь пока на деталях перечисленных примеров, рассмотрим об-
щие подходы к подобным задачам. Параметр Sender, используемый в ряде этих
примеров, объявлен в заголовках функций в C++Builder как TObject *Sender, т.е.
как указатель на объект типа TObject. Класс TObject, как вы можете увидеть в
разделе 15.2 главы 15, является базовым классом всех компонентов в C++Builder.
Но в нем не объявлено никаких свойств, которые можно было бы использовать в
обработчике события. Поэтому при обращении к каким-то свойствам объектов вам
надо явным образом осуществлять приведение типа параметра Sender к тому клас-
су, в котором требуемые свойства объявлены. Пусть, например, вы пишете обра-
ботчик, который должен в качестве надписи (свойство Caption) метки Labell выво-
дить текст: «Произошло событие в компоненте ...». Имя компонента, которое вам
надо включать в эту надпись, содержится в свойстве Name. Но это свойство, как вы
можете увидеть в разделе 15.2 главы 15, описывающем иерархию классов, появля-
ется только начиная с класса TComponent. Значит именно к этому классу вам надо
привести тип параметра Sender. Тогда соответствующий оператор будет иметь вид:

Labell->Caption = "Произошло событие в компоненте " +

( (TComponent *)Sender)->Name;

Выражение ((TComponent *)Sender) является приведением типа параметра
Sender к типу указателя на объект класса TComponent. Только в этом классе и в
его потомках появляется свойство Name, которое вам нужно. Приведенный опера-
тор будет работать для любых компонентов: окон, меток, кнопок и т.д., поскольку
классы всех компонентов являются производными от TComponent.

Если подобное приведение типов требуется во многих операторах вашей функ-
ции, то для сокращения записи можно один раз определить указатель на объект
Sender как указатель на требуемый класс, а затем во всех операторах использо-
вать его. Это сделано, например, в следующем коде:

TComponent *0bj = (TComponent *)Sender;

ЬаЬе11->Сар11оп="Произошло событие в компоненте " + Obj->Name;

Первый из этих операторов объявляет переменную Obj как указатель на объ-
ект класса TComponent и с помощью явного приведения типа присваивает этому
указателю ссылку на тот объект, на который указывает Sender. После этого пере-
менную Obj можно везде использовать как указатель на этот объект.

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

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

В ряде случаев требуется определить истинный класс объекта, на который
указывает параметр Sender. Это можно сделать с помощью метода ClassName,
объявленного в классе TObject как

ShortString   fastcail ClassName();

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

Labell->Caption = Sender->ClassName();