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

ля на него. Для создания объекта применяется операция new. В ней после ключе-
вого слова new указывается класс компонента. Если объект является компонен-
том, то после класса компонента в скобках указывается компонент — хозяин (Ow-
ner). Кроме того после создания компонента обязательно надо указать его родите-
ля (Parent) — компонент, на котором размещается новый компонент. Пока не за-
дан родитель, компонент нельзя увидеть.
Рассмотрим следующий код:

TLabel *Labl = new TLabel (Formi);

Labl->Parent = Formi;

Labl->Caption = "Это новая метка";

Первый из этих операторов создает указатель Labi на объект-метку типа TLa-
bel и создает с помощью new сам объект-метку с хозяином Formi. Последующие
операторы используют указатель Labi для задания свойств метки: размещают ее
на форме Formi и задают на ней надпись «Это новая метка».

Поскольку никакие другие свойства метки не заданы, они будут установлены
конструктором класса TLabel с умолчанием. Этот конструктор неявным образом
вызывается операцией new.

1.6.6.2 Идентификация объекта неизвестного класса

В предыдущем разделе было рассмотрено объявление указателей на объекты и
было показано, что тип такого указателя может определяться не обязательно клас-
сом конкретного объекта, но и любым классом-предком. В C++Builder это исполь-
зуется достаточно широко. Например, во все обработчики событий передается в ка-
честве параметра Sender — указатель на объект, в котором произошло событие.
Зачем нужен этот параметр? Конечно, если вы пишете обработчик какого-то собы-
тия в конкретном компоненте, например, пишете для кнопки Buttoni обработчик
события OnCUck, которое наступает при щелчке на ней мыши, то параметр Sender
вам не нужен. Вы и без этого параметра знаете, что событие произошло именно в
кнопке Buttoni. Но часто для разных компонентов нужна идентичная реакция на
идентичные события. В этих случаях писать отдельные одинаковые обработчики
для разных компонентов нерационально. Можно ограничиться одним обработчи-
ком для всех этих компонентов. Это обеспечит существенно более компактный
код, его будет проще отлаживать, да и размер загрузочного модуля вашей про-
граммы будет меньше.

В этой книге вы найдете немало таких примеров. Приведем в чисто описатель-
ном плане некоторые из них. В главе 4 в разделах 4.1.7 и 4.3.2.2 описана задача
разработки окон редактирования таких, чтобы при нажатии пользователем клави-
ши Enter фокус передавался бы следующему окну редактирования. Обработка на-
жатия клавиш во всех таких окнах может быть сделана одним обработчиком, что,
конечно, лучше, чем писать одинаковые обработчики для каждого окна. В той же
главе в разделе 4.2.5 описана задача синхронного масштабирования всех оконных
компонентов, содержащихся в некотором контейнере. С помощью указателя на ба-
зовый класс TWinConroI всех оконных компонентов эта задача решается простым
циклом, причем изменяются размеры всех оконных компонентов, независимо от
того, к какому классу каждый из них принадлежит. Это много эффективнее, чем
писать отдельный оператор для каждого компонента. В разделе 4.4 описывается
техника Drag&Drop — перетаскивание информации об объектах. В этом примере
также обобщенный подход позволяет обойтись одним обработчиком события для
разных объектов и даже разных классов объектов. В главе 3 в разделе 3.6.7 описа-
на организация поиска фрагмента текста в диалогах Найти и Заменить. Для этих
разных классов компонентов процедура поиска одна и та же, так что ее можно осу-
ществлять одним обработчиком.

Подобных примеров в книге будет много. Причем во многих случаях вопрос не
только в эффективности кода. Если вы в процессе проектирования добавляете в