I

Проектирование графического интерфейса пользователя______________257

if (((TComponent *)Sender)->Name == "Editi")

проверяет, не является ли этот компонент компонентом с именем Editi. Аналогич-
но используется параметр Sender, если надо применить к источнику события не-
который метод. Например, оператор

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

увеличивает на 10% размер любого оконного компонента, в котором произошло
обрабатываемое событие.

Если к обработчику события могут обращаться компоненты разных классов,
то перед применением к ним каких-то методов или заданием значений каких-то
_^  параметров полезно определить, является ли класс источника сигналов наследни-
JB ком того класса, в котором эти методы и события впервые объявлены. Это пока-
'^   жет, имеется ли в источнике события соответствующий метод или класс. Напри-
мер, поскольку метод масштабирования ScaleBy определен только для оконных
компонентов, т.е. для классов, являющихся потомками TWinControl, то приве-
.   денный выше оператор лучше заменить на:

^R     if (Sender->InheritsFrom(_classid(TWinControl)))

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

^Ш     В этом операторе структура if проверяет, является ли класс объекта, на кото-
^И рый указывает Sender, наследником TWinControl. Пренебрежение подобными
"• проверками может приводить к ошибкам выполнения с непредсказуемыми послед-
JB  ствиями. Все это подробно описано в главе 1 в разделе 1.6.6.2.
I^R     Помимо параметра Sender в обработчики событий OnMouseDown и OnMouse-
^В Up передаются параметры, позволяющие распознать нажатую кнопку, нажатые
^и при этом вспомогательные клавиши, а также определить координаты курсора
!• мыши. Заголовок обработчика события OnMouseDown или OnMouseUp может
.• иметь, например, следующий вид:

Ж      void_fastcall TFormI::EditlMouseDown(TObject *Sender,
^K              TMouseButton Button, TShiftState Shift, int X, int Y)

^B     Помимо уже рассмотренного нами параметра Sender в обработчик передаются
^Н параметры Button, Shift, X и Y.

^В     Параметр Button типа TMouseButton определяет нажатую в этот момент
^И кнопку мыши. Тип TMouseButton — перечислимый тип, определяемый следу ю-

^в щим образом:

^В      enum TMouseButton { mbLeft, mbRight, mbMiddle };

^U     Значение mbLeft соответствует нажатию левой кнопки мыши, значение
^и mbRight — правой, а значение mbMiddle — средней. Например, если вы хотите,
U чтобы обработчик реагировал на нажатие только левой кнопки, вы можете его пер-

•Ж вым оператором написать:

Д      if (Button != mbLeft) return;

т      Тогда, если значение Button не равно mbLeft, т.е. нажата не левая кнопка,

• выполнение обработчика прервется.

•     Параметр Shift типа TShiftState определяет, какие вспомогательные клави-

• ши на клавиатуре нажаты в момент нажатия кнопки мыши. Тип TShiftState —
J множество, определенное следующим образом:

•       enum Classes_1 { ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle,

«ssDouble } ;

typedef Set<Classes_1, ssShift, ssDouble> TShiftState;

9 Зах.764