Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
_N6_.doc
Скачиваний:
0
Добавлен:
24.04.2019
Размер:
166.91 Кб
Скачать

Обработка событий клавиатуры и мыши

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

1 События мыши

1.1 Последовательность событий

В компонентах Delphi определен ряд событий, связанных с мышью. Это события:

Событие

Описание

OnClick

Щелчок мыши на компоненте и некоторые другие действия пользователя

OnDblClick

Двойной щелчок мыши на компоненте

OnMouseDown

Нажатие клавиши мыши над компонентом. Возможно распознавание нажатой кнопки и координат курсора мыши

OnMouseMove

Перемещение курсора мыши над компонентом. Возможно распознавание нажатой кнопки и координат курсора мыши

OnMouseUp

Отпускание ранее нажатой кнопки мыши над компонентом. Возможно распознавание нажатой кнопки и координат курсора мыши

OnStartDrag

Начало процесса перетаскивания объекта. Возможно распознавание перетаскиваемого объекта

OnDragOver

Перемещение перетаскиваемого объекта над компонентом. Возможно распознавание перетаскиваемого объекта и координат курсора мыши

OnDragDrop

Отпускание ранее нажатой кнопки мыши после перетаскивания объекта. Возможно распознавание перетаскиваемого объекта и координат курсора мыши

OnEndDrag

Еще одно событие при отпускании ранее нажатой кнопки мыши после перетаскивания объекта. Возможно распознава­ние перетаскиваемого объекта и координат курсора мыши

OnEnter

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

OnExit

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

OnMouse Wheel

Событие при вращении колесика мыши в любую сторону. Начиная с Delphi 5

OnMouse-WheelUp

Вращение колесика мыши вверх. Наступает, если вращение не обработано по событию OnMouseWheel. Начиная с Delphi 5

OnMouse-WheelDown

Вращение колесика мыши вниз. Наступает, если вращение не обработано по событию OnMouseWheel. Начиная с Delphi 5

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

• Пользователь выбрал элемент в сетке, дереве, списке, выпадающем списке, нажав клавишу со стрелкой.

• Пользователь нажал клавишу пробела, когда кнопка или индикатор были

в фокусе.

• Пользователь нажал клавишу Enter, а активная форма имеет кнопку по умолчанию, указанную свойством Default.

• Пользователь нажал клавишу Esc, а активная форма имеет кнопку прерывания, указанную свойством Cancel.

• Пользователь нажал клавиши быстрого доступа к кнопке или индикатору. На­пример, если свойство Caption индикатора записано как «&Полужирный» и символ 'П' подчеркнут, то нажатие пользователем комбинации клавиш Alt-П вызовет событие OnClick в этом индикаторе.

• Приложение установило в true свойство Checked радиокнопки RadioButton.

• Приложение изменило свойств Checked индикатора CheckBox.

• Вызван метод Click элемента меню.

Для формы событие OnClick наступает, если пользователь щелкнул на пустом месте формы или на недоступном компоненте.

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

В момент запуска приложения из рассматриваемых нами событий наступает только событие OnEnter в компоненте, на который передается фокус. Это событие не связано с какими-то действиями пользователя, так что не будем на нем останавливаться.

Теперь рассмотрим простейшее действие пользователя: переключение с помощью мыши фокуса с одного элемента на другой. Последовательность событий в этом случае приведена в таблице:

Таблица 1 Последовательность событий мыши при переключении фокуса

Действие пользователя

Событие

Перемещение курсора мыши

Множество событий OnMouseMove в первом

компоненте

Перемещение курсора мыши в пределах формы

Множество событий OnMouseMove в форме

Перемещение курсора мыши в пределах второго компонента

Множество событий OnMouseMove во втором компоненте

Нажатие кнопки мыши

OnExit в первом компоненте

OnEnter во втором компоненте

OnMouseDown во втором компоненте

Отпускание кнопки мыши

OnClick во втором компоненте

OnMouscUp во втором компоненте

События OnMouseMove происходят постоянно в процессе перемещения курсора мыши и даже просто при его дрожании, неизбежном, если пользователь не снимает руки с мыши. Это надо учитывать и пользоваться этим событием очень осторожно, поскольку оно, в отличие от других, происходит многократно.

Как видно из приведенной таблицы, каждое действие пользователя, связанное с нажатием или отпусканием кнопки мыши приводит к серии последовательно наступающих событий. В обработчиках событий OnMouseDown и OnMouseUp можно распознать, какая кнопка мыши нажата и в какой точке компонента находится в данный момент курсор мыши.

Рассмотренная в таблице последовательность событий имеет место, если во втором компоненте свойство DragMode равно dmManual (ручное начало процесса перетаскивания), как это установлено по умолчанию. Если же это свойство равно dmAutomatic (автоматическое начало процесса перетаскивания), то все рассмотренные события, связанные с манипуляцией мышью, заменяются следующими:

OnMouseDown

Заменяется на OnStartDrag

OnMouseMove

Заменяется на событие OnDragOver того компонента, над которым перемещается курсор мыши

OnMouseUp

Заменяется на событие OnDragDrop компонента, над которым завешается перетаскивание (если компонент может воспринять информацию от перетаскиваемого объекта), и последующее событие OnEndDrag компонента, который перетаскивался

События OnExit и OnEnter вообще не возникают, поскольку переключения фокуса не происходит. Не наступает также событие OnClick.

Если в примере, приведенном в таблице 1, щелчок делается на объекте, который уже находится в этот момент в фокусе, то не происходят события OnExit и OnEnter. В этом случае при нажатии кнопки нступает только событие OnMouseDown, а при отпускании кнопки — события OnClick и OnMouseUp.

Теперь рассмотрим последовательность событий при двойном щелчке на компоненте. Она приведена в таблице 2. Распознавать нажатую кнопку мыши по-прежнему можно только в событиях OnMouseDown и OnMouseUp. Если же надо распознать именно двойной щелчок какой-то определенной кнопкой мыши, то можно, например, ввести некую переменную, являющуюся флагом двойного щелчка, устанавливать этот флаг в обработчике события OnDblClick, а в обработчиках событий OnMouseDown или OnMouseUp проверять этот флаг и, если он установлен, то сбрасывать его и выполнять запланированные действия.

Таблица 2 Последовательность событий мыши при двойном щелчке на компоненте

Действие пользователя

Событие

Первое нажатие кнопки мыши

OnMouseDown. Возможно распознавание нажатой кнопки и координат курсора мыши OnClick

Первое отпускание кнопки мыши

OnMouseUp. Возможно распознавание нажатой кнопки и координат курсора мыши

Второе нажатие кнопки мыши

OnDblClick

OnMouseDown. Возможно распознавание нажатой кнопки и координат курсора мыши

Второе отпускание кнопки мыши

OnMouseUp. Возможно распознавание нажатой кнопки и координат курсора мыши.