В мові програмування Pascal ABC для обробки подій в графічному вікні використовується спеціальний модуль Events.
Модуль Events призначений для створення програм, в яких
використовують методи керування подіями. Даний модуль використовується в парі з
модулем
GraphABC
.
В ньому
містяться команди для обробки подій, які відбуваються на пристроях введення
(клавіатура та миша).
В випадку підключення модулів
GraphABC
і
Events програма після запуску та виконання тіла програми не
завершується, а продовжує виконуватися, відстежуючи події, що виникають в
графічному вікні при використанні пристроїв введення. Тобто програма відстежує
події, які стосуються пристроїв введення, а також дій, пов'язаних з графічним
вікном (зміна розмірів та закриття вікна). Робота програми завершується тільки
після події, яка закриває графічне вікно.
Змінна |
Подія |
OnMouseDown
|
Натискання клавіші миші |
OnMouseUp
|
Відпускання клавіші миші |
OnMouseMove
|
Переміщення миші |
OnKeyDown
|
Натискання будь-якої клавіші керування на клавіатурі |
OnKeyUp
|
Відпускання клавіші клавіатури |
OnKeyPress
|
Натискання символьної клавіші клавіатури |
OnResize
|
Зміна розмірів графічного вікна |
OnClose
|
Закриття графічного вікна |
До початку роботи програми значення
процедурних змінних дорівнюють нулю. Для того щоб при настанні певної події
була виконана певна дія, потрібно в програмі процедурній змінній присвоїти
конкретну процедуру, яка буде виступати в ролі оброблювача подій. При виникненні
однієї з вище перерахованих подій перевіряється чи містить відповідна
процедурна змінна посилання на процедуру-оброблювач, якщо вона існує, то
відповідна процедура-оброблювач виконується.
Процедурні змінні, які відповідають певним
подіям, в модулі Events описані наступним чином:
Var
- OnMouseDown, OnMouseUp, OnMouseMove: procedure (x,y,mousebutton: integer); – параметри х, у в оброблювачах OnMouseDown, OnMouseUp, OnMouseMove визначають координату курсору миші в момент настання події, параметр mousebutton може приймати наступні значення: 0 – жодна клавіша миші не натиснута, 1 – натиснута ліва клавіша миші, 2 – натиснута права клавіша миші;
- OnKeyDown, OnKeyUp: procedure (key: integer); – параметр key в оброблювачах OnKeyDown, OnKeyUp визначає певний віртуальний код натиснутої клавіші;
- OnKeyPress: procedure (ch: char); – параметр ch в оброблювачі OnKeyPress визначає натиснутий символ, якщо змінна-подія OnKeyPress має оброблювач, то графічне вікно не закривається при натисканні клавіші Esc;
- OnResize, OnClose: procedure;.
Наприклад, якщо задана наступна процедура-оброблювач:
procedure
MouseDown(x,y,mb: integer);
begin
write(1);
end;
яка в основній програмі зв'язана з
відповідною процедурною змінною:
OnMouseDown:=MouseDown;
то всякий раз при натисканні клавіш миші в
графічному вікні буде виводитись число 1.
Приклад такої програми:
Program p1;
uses GraphABC,Events,crt;
procedure MouseDown(x,y,mb: integer);
begin
write(1);
end;
begin
OnMouseDown:=MouseDown;
end.
Віртуальні коди клавіш
VK_Left
VK_Right VK_Up VK_Down VK_Back VK_Tab VK_Return VK_Escape VK_Space |
VK_Pause
VK_CapsLock VK_NumLock VK_ScrollLock
VK_Insert
VK_Delete VK_Control VK_Shift VK_Alt |
VK_F1
VK_F2 VK_F3 VK_F4 VK_F5 VK_F6 VK_F7 VK_F8 VK_F9 |
VK_F10
VK_F11 VK_F12
VK_PageUp VK_PageDown
VK_Home VK_End |
Алфавітно-цифрові клавіші мають
віртуальний код, який дорівнює коду відповідного символу.
Приклад програми для обробки
подій.
Програма малювання мишкою в графічному вікні.
uses GraphABC,Events;
procedure MouseDown(x,y,mb: integer);
begin
MoveTo(x,y);
end;
procedure MouseMove(x,y,mb: integer);
begin
if mb=1 then LineTo(x,y);
end;
begin
OnMouseDown:=MouseDown;
OnMouseMove:=MouseMove;
end.
|
Програма, яка дає можливість переміщувати графічне вікно клавішами
курсора.
uses GraphABC,Events;
procedure KeyDown(Key: integer);
begin
case Key of
VK_Left: SetWindowLeft(WindowLeft-2);
VK_Right: SetWindowLeft(WindowLeft+2);
VK_Up: SetWindowTop(WindowTop-2);
VK_Down: SetWindowTop(WindowTop+2);
end;
end;
begin
OnKeyDown:=KeyDown;
end.
|
uses GraphAbc,Events;
var x,y,i:integer;
procedure a;
begin
for i:=0 to 230 do
begin
setbrushcolor(clAqua);
setpencolor(clred);
circle(x,y-i,10);
sleep(10);
setbrushcolor(clwhite);
setpencolor(clwhite);
circle(x,y-i,10);
end;
for i:=0 to 310 do
begin
setbrushcolor(clAqua);
setpencolor(clred);
circle(320-i,0+i,10);
sleep(10);
setbrushcolor(clwhite);
setpencolor(clwhite);
circle(320-i,0+i,10);
end;
end;
procedure b;
begin
for i:=0 to 310 do
begin
setbrushcolor(clAqua);
setpencolor(clred);
circle(x+i,y,10);
sleep(10);
setbrushcolor(clwhite);
setpencolor(clwhite);
circle(x+i,y,10);
end;
for i:=0 to 230 do
begin
setbrushcolor(clAqua);
setpencolor(clred);
circle(640-i,240-i,10);
sleep(10);
setbrushcolor(clwhite);
setpencolor(clwhite);
circle(640-i,240-i,10);
end;
end;
procedure mousedown(x,y,mb:integer);
begin
If mb=1 then a;
If mb=2 then b;
end;
begin
setwindowsize(640,480);
setpenwidth(2);
x:=320;
y:=240;
Onmousedown:=MouseDown;
end.
Немає коментарів:
Дописати коментар