Модуль Events предназначен для создания программ, управляемых событиями. Он работает
только в паре с модулем GraphABC. При одновременном подключении модулей GraphABC и Events программа после запуска и выполнения своего основного блока begin/end не завершается, а продолжает выполняться, отслеживая возникающие события. После закрытия графического окна программа завершается.
Каждому
событию соответствует своя процедурная
переменная:
- нажатие мыши 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. Изменение цвета должно происходить каждый раз после отпускания мыши (цвет - случайный).
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. Измените программу таким образом, чтобы при закрытии окна трижды менялся его цвет (случайным образом).