- учимся программировать
- Программированию нельзя научить, можно только научится
- Урок 7. Свойства компонентов. События мыши и клавиатуры
- Критерии оценки:
- Обращение к свойству объекта в программе
- Оператор With
- События
- События мыши
- События OnMouseDown, OnMouseMove, OnMouseUp
- Источник событий – параметр Sender
- Распознаем, какая кнопка мыши нажата – параметр Button
- Распознаем, какая вспомогательная клавиша была нажата – параметр Shift
- Определяем координаты курсора – параметры X и Y.
- События клавиатуры
учимся
программировать
Программированию нельзя научить, можно только научится
Главная » Уроки по ООП » Урок 7. Свойства компонентов. События мыши и клавиатуры
Урок 7. Свойства компонентов. События мыши и клавиатуры
Критерии оценки:
На «3» — прочесть и законспектировать конспект
На «4» — ответить на вопросы и выполнить часть заданий
На «5» — ответить на вопросы и выполнить задания, при этом обязательно задания 5, 7
Обращение к свойству объекта в программе
В программе к свойству объекта можно обратиться так:
Например: Label1.Caption.
Иногда свойство объекта является в свою очередь объектом. Тогда в обращении к этому свойству указывается через точки вся цепочка предшествующих объектов.
Например, метки имеют свойство Font — шрифт, которое в свою очередь является объектом. У этого объекта имеется множество свойств, в частности, свойство Color — цвет шрифта. Чтобы сослаться на цвет шрифта метки Label1, надо написать Label1.Font.Color.
Аналогично для доступа к методам объекта.
Например: Label1.Free.
Оператор With
Оператор with используется для сокращения записи при обращении к полям записи или к свойствам и методам объекта. В этих случаях применение with позволяет избежать повторных ссылок на объект в последующих операторах. Например, группу операторов:
с помощью with можно записать короче:
with Form1.Label1 do begin
left:=left+10;
font.color:=clRed;
end;
События
Приложения Delphi используют управляемые событиями методы для организации взаимодействия между программой и пользователем. Большая часть кода, которую Вы будете писать в Delphi, будет инициироваться событиями. В принципе событием может быть изменение любой величины. Происхождение события заставляет работать определенный объект, при этом объект получает заранее определенные параметры для своей настройки на работу.
Процедура, инициируемая событием, называется обработчиком события.
События делятся на три основные категории:
- события мыши,
- события клавиатуры и
- системные события.
Все действия пользователя при взаимодействии с приложением сводятся к перемещению мыши, нажатию кнопок мыши и нажатию клавиш клавиатуры. Рассмотрим обработку в приложении событий, связанных с этими манипуляциями пользователя.
События мыши
Событие onClick — щелчок мыши на компоненте и некоторые другие действия пользователя
Задание 1: Напишите приложение, которое при щелчке левой кнопкой мыши по форме перекрашивает ее в красный цвет.
Ход работы:
Создайте обработчик события OnClick: для этого в объектном инспекторе перейдите на страницу Events, найдите событие onClick и выполните двойной щелчок мышью в правой колонке, напротив этого события.
На переднем плане появится окно редактора с помещенной в нужное место модуля заготовкой обработчика события OnClick.
Для изменения цвета формы в обработчике события OnClick напишите:
Form1.Color:=clRed;
Задание 2. Напишите приложение, в котором при нажатии на левую кнопку мыши происходит смена цвета с зеленого на красный, и, наоборот, с красного — на зеленый.
Ход работы:
В соответствии с условием задачи в обработчике события OnClick формы необходимо проанализировать свойство Color формы: если его значение соответствует красному, то изменить его на зеленый (clGreen), иначе присвоить значение красный. На языке Object Pascal это записывается так:
if Form1.Color=clRed then Form1.Color:=clGreen else Form1.Color:=clRed;
Событие OnDblClick — двойной щелчок мыши на компоненте
Задание 3. Напишите приложение, в котором при двойном щелчке левой кнопкой мыши изменяется вид курсора.
Ход работы:
Каждое значение свойства Cursor имеет свой числовой эквивалент в пределах от -21 (crHandPoint) до 0 (crDefault). При каждом двойном щелчке левой кнопкой мыши значение свойства Cursor будем увеличивать на единицу, при достижении значения 0 — восстановим значение -21.
Введите в обработчик события формы OnDblClick следующий оператор:
if Cursor=0 then Cursor:=-21 else Cursor:=Cursor+1;
Вопросы:
1. Когда происходит событие onClick?
2. Когда происходит событие onDblClick?
События OnMouseDown, OnMouseMove, OnMouseUp
Нажатие клавиши мыши над компонентом. Возможно распознавание нажатой кнопки и координат курсора мыши.
Перемещении курсора мыши над компонентом. Возможно распознавание нажатой кнопки и координат курсора мыши.
Оно происходит постоянно в процессе перемещения курсора мыши и даже просто при его дрожании, неизбежном, если пользователь не снимает руки с мыши. Это надо учитывать и пользоваться этим событием очень осторожно, поскольку оно, в отличие от других, происходит многократно.
Отпускание ранее нажатой кнопки мыши над компонентом.
Возможно распознавание нажатой кнопки и координат курсора мыши
Источник событий – параметр Sender
Во все обработчики событий, связанных с манипуляциями мыши передается параметр Sender типа TObject. Он содержит указатель на компонент, в котором произошло событие.
Он используется, если пишется обработчик события для одного конкретного компонента. Однако часто один обработчик применяется для нескольких компонентов.
Задание 4: создать несколько кнопок, у которых будет один обработчик события и который будет уметь работать с разными типами кнопок.
Ход работы:
Установите на форму несколько разных кнопок TBitBtn, TSpeedButton (на странице Additional в палитре инструментов).
Выделите все кнопки TSpeedButton и установите свойство GroupIndex=1.
Создайте следующий обработчик для кнопки BitBtn1.
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
if Sender is TBitBtn then TBitBtn(Sender).Enabled := False;
if Sender is TSpeedButton then TSpeedButton(Sender).Down := True;
end;
Всем остальным кнопкам присвойте этот обработчик с помощью Object Inspector. Для этого выделите все кнопки, перейдите в окно Object Inspector и на закладке Events найдите событие onClick. Щелкните в колонке справа от события и из списка выберите событие Bitbtn1Click (рис.1)
Рисунок 1
Распознаем, какая кнопка мыши нажата – параметр Button
Параметр Button типа TMouseButton определяет нажатую в этот момент кнопку мыши.
Может принимать следующие значения:
- mbLeft соответствует нажатию левой кнопки мыши
- mbRight — правой,
- mbMiddle — средней.
Например, если вы хотите, чтобы обработчик реагировал на нажатие только левой кнопки, вы можете его первым оператором написать:
if (Button <> mbLeft) then exit;
Тогда, если значение Button не равно mbLeft, т.е. нажата не левая кнопка, выполнение обработчика прервется.
Распознаем, какая вспомогательная клавиша была нажата – параметр Shift
Параметр Shift может принимать следующие значения:
ssShift — нажата клавиш Shift,
ssAlt- нажата клавиш Alt,
ssCtrl- нажата клавиш Ctrl
ssLeft- нажата левая кнопка мыши
ssRight- нажата правая кнопка мыши
ssMiddle- нажата средняя кнопка мыши
Параметр Button соответствует кнопке, нажимаемой в данный момент, а параметр Shift содержит информацию о том, какие кнопки были нажаты, включая и те, которые были нажаты ранее. Поскольку Shift является множеством, проверять наличие в нем тех или иных элементов надо операцией in.
Пример: реагируем на событие, заключающееся в нажатии левой кнопки мыши при нажатой клавише Alt:
if (Button = mbLeft) and (ssAlt in Shift) then .
Аналогичные параметры Button и Shift передаются и в обработчик события OnMouseUp. Отличие только в том, что параметр Button соответствует не нажимаемой в данный момент, а отпускаемой кнопке. Параметр Shift передается также в обработчик события OnMouseMove, так что и в этом обработчике можно определить, какие клавиши и кнопки нажаты.
Определяем координаты курсора – параметры X и Y.
Во все события, связанные с мышью, передаются также координаты курсора X и Y. Эти параметры определяют координаты курсора в клиентской области компонента. Благодаря этому можно обеспечить различную реакцию в зависимости оттого, в какой части клиентской области расположен курсор.
Вопросы:
1. В какой момент времени выполняются события onMouseUp, onMouseDown, onMouseMove?
2. Какие параметры передаются в обработчик события onMouseDown?
3. Для чего используется каждый из параметров?
Задание 5.
При перемещении курсора по форме при нажатой клавише Shift выдавать в заголовок формы координаты курсора.
Задание 6. Напишите приложение, позволяющее рисовать отрезок на форме.
Ход работы:
Чтобы нарисовать на форме пунктирную линию красного цвета от точки с координатами (10,10) до точки (300,300), создайте обработчик события формы onClick и введите следующие операторы:
with Canvas do begin
Pen.Color:=ClRed; //цвет линии
Pen.Style:=PsDash; //стиль линии
MoveTo(10,10); //переместить курсор в точку (10,10)
LineTo(300,300); //нарисовать линию из точки, где находится курсор в точку (300,300)
end;
Задание 7. Напишите приложение, которое при нажатии мыши устанавливает курсор в точку, а при отпускании кнопки мыши в другом месте формы рисует отрезок от первой точки до второй. Использовать события MouseDown и MouseUp, для координат использовать параметры x,y.
Событие OnEnter – возникает в момент получения элементом фокуса в результате манипуляции мышью, нажатия клавиши табуляции или программной передачи фокуса.
Событие OnExit – возникает в момент потери элементом фокуса в результате манипуляции мышью, нажатия клавиши табуляции или программной передачи фокуса.
События клавиатуры
Обработку клавиатуры можно выполнить, используя комбинацию трех событий.
Событие OnKeyDown происходит при нажатии любой клавиши, включая функциональные и специальные:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
Например, если мы хотим по нажатию на клавишу Esc закрывать форму, в обработчик события onKeyDown добавить следующий оператор:
if key=VK_ESCAPE then Close;
Здесь метод Close закрывает форму, key – параметр, который определяет нажатую клавишу, VK_ESCAPE — символическое имя клавишы Esc.
Задание 8. Создать приложение, которое закрывается при нажатии клавишы Esc.
Задание 9. С помощью дописки кода просмотреть другие символические имена клавиш.
Событие OnKeyPress возникает при нажатии клавиши, генерирующей символы ASCII, включая управляющие клавиши:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
Событие OnKeyUp происходит при освобождении любой клавиши:
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
Каждый из обработчиков событий получает по крайней мере, один параметр, называемый Key, который представляет нажатую клавишу. В обработчиках событий OnKeyDown и OnKeyUp параметр Key является беззнаковым значением типа Word, которое представляет код виртуальной клавиши Windows. В обработчике события OnKeyPress параметр Key — это значение типа Char, представляющее символ ASCII. Несмотря на то, что обе переменные называются Key, они представляют различную информацию. Все ASCII-символы имеют соответствующие коды виртуальных клавиш, но многие виртуальные клавиши не имеют ASCII-эквивалента, например клавиша F1.
Задание 10. Напишите приложение, закрывающееся при одновременном нажатии клавиш Alt и X.
Ход работы:
Для обработки воспользуемся событием ОпКеуDown. Создайте обработчик этого события. Воспользуемся значением параметра Shift для определения нажатия клавиши Alt:
if ssAlt in Shift then Close;
Определим код клавиши X. Добавьте в обработчик события OnKeyDown оператор:
Caption:=IntToStr(Key);
Key — код нажатой клавиши.
Запустите приложение. Определите виртуальный код клавиши с латинской буквой «х».
Итак, виртуальный код клавиши с латинской буквой «х» равен 88. Для решения задачи напишем следующий код обработчика события OnKeyDown формы:
if (ssAlt in Shift) and (Key=88) then Close;
Убедитесь, что при одновременном нажатии клавиш Alt и латинской буквы «х» независимо от выбранного языка приложение закрывается.
Задание 11. Напишите программу, которая определяет нажатую на клавиатуре клавишу и выводит в заголовок формы информацию об этой клавише.
Например, при нажатии строчной латинской буквы ‘а’ в заголовке должна быть надпись:
«Код виртуальной клавиши=65 а — строчная латинская буква ASCII-Kod=97»
(аналогично для русских букв, цифр, специальных символов — запятая, точка, скобки и т. д.); при нажатии клавиши стрелка вправо:
«Код виртуальной клавиши = 39» (аналогично для всех специальных клавиш — Fl, Insert и т. д.).
Ход работы:
Для получения информации о коде виртуальной клавиши создадим обработчик события OnKeyDown:
Caption:=’код виртуальной клавиши=’+IntToStr(Key);
Для отображения информации о символах воспользуемся обработчиком события OnKeyPress, параметр Key которого содержит символьное значение, представляющее символ ASCII. Создайте обработчик события OnKeyPress и введите оператор:
Caption:=Key;
Сохраните приложение и запустите его. При нажатии на клавишу «F» в заголовке формы отображается символ F.
Это объясняется тем, что при нажатии на клавишу вначале происходит событие OnKeyDown, после обработки которого возникает событие OnKeyPress, и в результате этого код виртуальной клавиши затирается изображением символа. Измените код обработчика события onKeyPress следующим образом:
Проверьте, является ли написанная программа решением поставленной задачи.
Вопросы:
1. Какие обработчики событий позволяют обрабатывать события клавиатуры?
2. Какой из обработчиков событий позволяет определить нажатие функциональной клавиши?
Источник