Основная часть пасьянса

h02111.jpg

Метод FormMouseUpO вызывается только при щелчке мышкой на канве формы. Щелчки на заголовке, меню, области командных Кнопок, границах окна этим методом не обрабатываются.

Весьма полезный параметр —

TShiftState Shift

Он характеризует, была ли при щелчке мышки нажата и удерживаема одна из системных клавиш Ctrl, Alt или Shift. Это можно определить, сравнив переменную Shift с одним из значений ssAlt, ssShift или ssCtrl.

Дополнительное значение ssDouble определяет, был ли выполнен одинарный или двойной щелчок мышкой.

При этом возможно отслеживать нажатие сразу нескольких клавиш — для этого класс TShiftState имеет метод ContainsQ, который проверяет, содержит ли соответствующая переменная, способная хранить несколько значений (так устроен'класс TShiftState) нужную константу. Например, чтобы выяснить, был ли сделан двойной щелчок мышкой и были ли при этом нажаты клавиши Ctrl и Shift, надо записать следующее логическое выражение:

Shift.Contains(ssDouble) && Shift-Contains(ssCtrl) && Shift.Contains(ssShift)

Более корректно говорить, что метод FormMouseUpO вызывается не просто при щелчке мышкой, а тогда, когда отпущена одна из ее клавиш. Ведь щелчок состоит из двух действий — нажатия клавиши мышки (для его обработки в C++Builder есть специальное событие OnMouseDown) и ее отпускания (уже известное событие OnMouseUp). Всегда лучше обрабатывать отпускание мышки, потому что пока она нажата, Windows в силу своего внутреннего устройства будет непрерывно — множество раз — вызвать метод FormMouseDown(). А метод FormMouseUpO всегда вызывается только один раз и сигнализирует о том, что щелчок действительно окончен.

Метод FormMouseDownQ подходит для обработки специфических действий пользователя по выделению, например, областей экрана или группы элементов с помощью нажатой мыши, но не для обработки одинарного или двойного щелчка.

Обрабатываем щелчок

Так как перемещение карты будет происходить в два этапа — сначала определяется исходная стопка, а потом — конечная, то в обработчике мышиного

211