Практическая работа 12(22)



Практическая работа №12

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

Теория

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

Событие

Описание

onClick

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

onDblClick

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

onMouseDown

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

onMouseMove

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

onMouseUp

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

onStartDrag

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

onDragOver

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

onDragDrop

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

onEndDrag

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

onEnter

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

onExit

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

Событие onClick происходит, если пользователь:

Щелкнул на компоненте

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

Нажал клавишу пробела, когда кнопка или индикатор были в фокусе

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

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

Нажал клавиши быстрого доступа к кнопке или индикатору

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

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

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

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

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

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

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

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

Событие

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

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

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

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

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

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

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

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

 

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

 

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

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

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

 

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

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

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

Событие

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

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

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

onClick

 

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

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

onDblClick

 

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

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

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

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

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

Например, можно использовать операцию is. Так оператор

If (Sender is TListBox) then …

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

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

If (Sender аs TControl).Name=’Edit1’ then

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

If (Sender = Edit1) then

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

(Sender аs TwinControl).ScaleBy(11,10);

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

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

procedure TForm1.Edit1MouseDown(Sender: TObject; Button: TMouseButton;

 Shift: TShiftState; X, Y: Integer);

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

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

TmouseButton=(mbLeft, mbRight, mbMiddle);

Значение MbLeft – нажатие левой кнопки мыши, MbRight – правой, MbMiddle – средней.

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

If (Button<>mbLeft) then exit;

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

TshiftState = set of (ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDouble);

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

If (Button=msLeft) and (ssAlt in Shift) then … или

If (ssLeft in Shift) …

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

Во все события, связанные с мышью, передаются также координаты курсора X и Y . Эти параметры определяют координаты курсора в клиентской области компонента. Благодаря этому можно обеспечить различную реакцию в зависимости от того, в какой части клиентской области расположен курсор. Пусть, например, в приложении имеется компонент Image1, содержащий некоторое изображение, и нужно обеспечить пользователя соответствующими пояснениями в зависимости от того, на какую часть изображения он покажет мышью:

Для перехода в режим получения информации можно предусмотреть на форме кнопку или раздел меню, при выборе которых параметру Cursor задается значение crHelp (это соответствует изображению курсора с вопросительным знаком):

procedure TForm1.SpeedButton1Click(Sender: TObject);

begin

 Cursor:=crHelp;

end;

Для отображения информации надо предусмотреть на форме окно редактирования, например Memo1.В событии MouseDown компонента Image1 и формы можно ввести обработчик вида:

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;

 Shift: TShiftState; X, Y: Integer);

begin

 if ((Sender as TControl).Name<>‘Image1’)

 then Cursor:=crDefault;

 if (Cursor<>crHelp) then exit;

 Memo1.Lines.Clear;

 if (x<120)And(y<120) then

 Memo1.Lines.Add(‘Это входная очередь’)

 else Memo1.Lines.Add(‘Это процессор’);

 Cursor:=crDefault; 

end;

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

Задание

3 балла

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

4 балла

На форме разместите кнопку, которая при попытке нажатия на нее, смещается в сторону.

5 баллов

На форме разместите компонент Image. При щелчке на этом компоненте на нем начинает двигаться анимированное изображение в течении некоторого периода, после чего снова появляется исходная картинка (например прыгающий мяч, летящая бабочка, идущий человек).






map