Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
_Delphi_1курс лекции / Тема 15 Обработка событий мыши.doc
Скачиваний:
59
Добавлен:
23.03.2015
Размер:
86.53 Кб
Скачать

Распознавание источника события, нажатых кнопок и клавиш, координат курсора Параметр Sender

Во все обработчики событий, связанных с манипуляциями мыши (как и во все другие обработчики) передается параметр Sender типаTObject. Этот параметр содержит указатель на компонент, в котором произошло событие. Он не требуется, если пишется обработчик события для одного конкретного компонента. Однако часто один обработчик применяется для нескольких компонентов. При этом какие-то операции могут быть общими для любых источников события, а какие-то требовать специфических действий. ТогдаSender можно использовать для распознавания источника события. Правда, поскольку типTObject не имеет никаких полезных для пользователя свойств и методов, то объектSender следует рассматривать как объект одного из производных отTObject типов. Например, если требуется распознать только тип объекта, можно использовать операцию is. Так оператор

if (Sender is TListBox) then ...

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

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

if (sender as TControl).Name = 'Editl' then ...

проверяет, не является ли этот компонент компонентом с именем Editl. Впрочем, в данном случае можно было бы просто определить, не является ли Sender объектомEditl:

if (Sender = Editl) then ...

Операцию as можно также использовать, если надо применить к источнику события некоторый метод. Например, оператор

(Sender as TWinControl).ScaleBy(11,10) ;

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

Помимо параметра Sender в обработчики событийOnMouseDown иOnMouseUpпередаются параметры, позволяющие распознать нажатую кнопку, нажатые при этом вспомогательные клавиши, а также определить координаты курсора мыши. Заголовок обработчика событияOnMouseDown илиOnMouseUp может иметь, например, следующий вид:

procedure TForml.EditlMouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

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

Параметр Button

Параметр Button типаTMouseButton определяет нажатую в этот момент кнопку мыши. ТипTMouseButton — перечислимый тип, определяемый следующим образом:

TMouseButton = (mbLeft, mbRight, mbMiddle);

mbLeft соответствует нажатию левой кнопки мыши,

mbRight — правой,

mbMiddle — средней.

Например, если вы хотите, чтобы обработчик реагировал на нажатие только левой кнопки, вы можете его первым оператором написать:

if (Button <> mbLeft) then exit;

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

Параметр Shift

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

TShiftState=setof(ssShift,ssAlt,ssCtrl,ssLeft,ssRight, ssMiddle, ssDouble);

Элементы этого множества соответствуют нажатию клавиш Shift (ssShift), Alt(ssAlt), Ctrl (ssCtrl), а также кнопок: левой (ssLeft), правой(ssRight), средней(ssMiddle). Информация о нажатых кнопках в параметрахButton и Shift имеет различный смысл. ПараметрButton соответствует кнопке, нажимаемой в данный момент, а параметрShift содержит информацию о том, какие кнопки были нажаты, включая и те, которые были нажаты ранее. Например, если пользователь нажмет левую кнопку мыши, а затем, не отпуская ее, нажмет правую, то после первого нажатия множествоShift будет равно [ssLeft], а после второго — [ssLeft,ssRight].

Если до этого пользователь нажал и не отпустил какие-то вспомогательные клавиши, то информация о них также будет присутствовать в множестве Shift.

Поскольку Shift является множеством, проверять наличие в нем тех или иных элементов надо операцией in. Например, если вы хотите прореагировать на событие, заключающееся в нажатии левой кнопки мыши при нажатой клавише Alt, можно использовать оператор:

if (Button = mbLeft) and (ssAlt in Shift) then ...

В приведенной структуре if первое условие (Button = mbLeft) можно заменить эквивалентным ему условием, проверяющим параметр Shift:

if (ssLeft in Shift) ...

Аналогичные параметры Button и Shift передаются и в обработчик событияOnMouseUp. Отличие только в том, что параметрButton соответствует не нажимаемой в данный момент, а отпускаемой кнопке. ПараметрShiftпередается также в обработчик событияOnMouseMove, так что и в этом обработчике можно определить, какие клавиши и кнопки нажаты:

procedure TForm1.Memo1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);