1. Обзор
Модуль Events предназначен для создания программ, управляемых событиями. Он работает только в паре с модулем GraphABC. При одновременном подключении модулей GraphABC и Events программа после запуска и выполнения своего основного блока begin/end не завершается, а продолжает выполняться, отслеживая возникающие события. После закрытия графического окна программа завершается.
Каждому событию соответствует своя процедурная переменная:
Переменные, соответствующие событиям, описаны в модуле Events следующим образом:
var
OnMouseDown, OnMouseUp, OnMouseMove: procedure (x,y,mousebutton: integer);
OnKeyDown, OnKeyUp: procedure (key: integer);
OnKeyPress: procedure (ch: char);
OnResize, OnClose: procedure;
Параметры x и y в обработчиках OnMouseDown, OnMouseUp и OnMouseMove определяют координаты курсора мыши в момент наступления события, параметр mousebutton равен 0, если кнопка мыши не нажата, 1, если нажата левая кнопка мыши, и 2, если нажата правая кнопка мыши. Параметр key в обработчиках OnKeyDownи OnKeyUp определяет виртуальный код нажатой клавиши. Параметр ch в обработчике OnKeyPress определяет нажатый символ. Если переменная-событие OnKeyPress имеет обработчик, то графическое окно не закрывается по нажатию клавиши Esc.
Каждому событию соответствует своя процедурная переменная:
- нажатие мыши OnMouseDown
- отпускание мыши OnMouseUp
- перемещение мыши OnMouseMove
- нажатие клавиши OnKeyDown
- отпускание клавиши OnKeyUp
- нажатие символьной клавиши OnKeyPress
- изменение размеров графического окна OnResize
- закрытие графического окна OnClose
Переменные, соответствующие событиям, описаны в модуле Events следующим образом:
var
OnMouseDown, OnMouseUp, OnMouseMove: procedure (x,y,mousebutton: integer);
OnKeyDown, OnKeyUp: procedure (key: integer);
OnKeyPress: procedure (ch: char);
OnResize, OnClose: procedure;
Параметры x и y в обработчиках OnMouseDown, OnMouseUp и OnMouseMove определяют координаты курсора мыши в момент наступления события, параметр mousebutton равен 0, если кнопка мыши не нажата, 1, если нажата левая кнопка мыши, и 2, если нажата правая кнопка мыши. Параметр key в обработчиках OnKeyDownи OnKeyUp определяет виртуальный код нажатой клавиши. Параметр ch в обработчике OnKeyPress определяет нажатый символ. Если переменная-событие OnKeyPress имеет обработчик, то графическое окно не закрывается по нажатию клавиши Esc.
2. События с мышью
Пример программы, в которой каждый раз при щелчке мыши по графическому окну в окно вывода будет выводиться "Щелчок мыши!"
uses GraphABC, Events;
procedure MouseDown(x,y,mb: integer);
begin
write('Щелчок мыши!');
end;
begin
OnMouseDown:=MouseDown;
end.
Задание 1. Измените эту программу таким образом, чтобы вывод данного текста происходил в графическое окно с задержкой на экране и последующим очищением окна.
Указание: для вывода текста в графическое окно используйте процедуру TextOut, для задержки sleep, для очистки окна ClearWindow.
Задание 2. Доработайте программу таком образом, чтобы текст выводился в точку, где произошел щелчок мыши.
Задание 3. Напишите программу, которая оставляет в точке, где происходит щелчок мыши, штамп (штамп - это некоторое графическое изображение, размер его не меняется).
Пример программы, рисование мышью.
uses GraphABC, Events;
procedure MouseDown(x,y,mb: integer);
begin
MoveTo(x,y);
end;
procedure MouseMove(x,y,mb: integer);
begin
SetWindowCaption('('+IntToStr(x)+','+IntToStr(y)+')');
if mb=1 then LineTo(x,y);
end;
begin
OnMouseDown:=MouseDown;
OnMouseMove:=MouseMove
end.
Задание 4. Измените цвет и толщину пера (цвет- красный, толщина - 10 пиксел).
Задание 5. Изменение цвета должно происходить каждый раз после отпускания мыши (цвет - случайный).
Пример программы, демонстрирующей обработку события OnClose (закрытие окна).
uses GraphABC,Events;
procedure CloseWin;
var i: integer;
begin
for i:=1 to 20 do
begin TextOut(10,20*i,'Не хочу закрываться!');
Sleep(100); end;
end;
begin
OnClose:=CloseWin;
end.
Задание 6. Измените программу таким образом, чтобы при закрытии окна трижды менялся его цвет (случайным образом).
Указание: для вывода текста в графическое окно используйте процедуру TextOut, для задержки sleep, для очистки окна ClearWindow.
Задание 2. Доработайте программу таком образом, чтобы текст выводился в точку, где произошел щелчок мыши.
Задание 3. Напишите программу, которая оставляет в точке, где происходит щелчок мыши, штамп (штамп - это некоторое графическое изображение, размер его не меняется).
Пример программы, рисование мышью.
uses GraphABC, Events;
procedure MouseDown(x,y,mb: integer);
begin
MoveTo(x,y);
end;
procedure MouseMove(x,y,mb: integer);
begin
SetWindowCaption('('+IntToStr(x)+','+IntToStr(y)+')');
if mb=1 then LineTo(x,y);
end;
begin
OnMouseDown:=MouseDown;
OnMouseMove:=MouseMove
end.
Задание 4. Измените цвет и толщину пера (цвет- красный, толщина - 10 пиксел).
Задание 5. Изменение цвета должно происходить каждый раз после отпускания мыши (цвет - случайный).
3. События с окном
Пример программы, демонстрирующей обработку события OnClose (закрытие окна).
uses GraphABC,Events;
procedure CloseWin;
var i: integer;
begin
for i:=1 to 20 do
begin TextOut(10,20*i,'Не хочу закрываться!');
Sleep(100); end;
end;
begin
OnClose:=CloseWin;
end.
Задание 6. Измените программу таким образом, чтобы при закрытии окна трижды менялся его цвет (случайным образом).
Это прекрасно, пойду, что ли, калькулятор сделаю
ОтветитьУдалитьобъяснить бы как это работает! Особенно с клавишами!
ОтветитьУдалитьПеред телом программы описываешь процедуру с нужным количеством параметров (имя процедуры может быть любым), например:
ОтветитьУдалитьprocedure MouseDown(x,y,mb: integer);
begin
MoveTo(x,y);
end;
потом нужно "привязать" эту процедуру к OnMouseMove (для справки, это переменная процедурного типа) внутри тела программы:
begin
OnMouseMove := MouseMove;
end;
Теперь при каждом перемещении мыши запускается процедура MouseMove, которой передаются координаты курсора и код нажатой клавиши mb (0 - ничего, 1 - левая кнопка мыши, 2 - правая).
Теперь о клавишах. Каждой клавише соответствует некоторый виртуальный код (например, клавише s соответствует код 83, левому и правому shift соответствует 16, клавише 5 на основной клавиатуре соответствует 53, а на цифровой клавиатуре 12).
OnKeyDown реагирует на нажатие клавиши, OnKeyUp реагирует на отжатие клавиши
OnKeyPress отличается от первых двух событий.
Здесь передаётся именно символ, а не код: если тебе нужно вводить символы, используй OnKeyPress, а если ты хочешь использовать клавиши ASWD для перемещения объекта, то используй OnKeyDown
А как сделать так, чтобы у меня фигура двигалась, когда я жму на кнопку мыши?
ОтветитьУдалитьА клавиши клавиатуры?
ОтветитьУдалить