Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции программирование.doc
Скачиваний:
15
Добавлен:
01.03.2025
Размер:
1.01 Mб
Скачать

Событийное программирование

Модуль Events предназначен для создания программ, управляемых событиями. Он работает только в паре с модулем GraphABC. При одновременном подключении модулей GraphABC и Events программа после запуска и выполнения своего основного блока (begin/end.) не завершается, а продолжает выполняться, отслеживая возникающие события. Все события связаны с графическим окном: это события, приходящие от мыши, клавиатуры, события изменения размеров графического окна и событие его закрытия. После закрытия графического окна (closewindow) программа завершается.

Каждому событию соответствует своя процедурная переменная:

Событие Переменная

нажатие мыши OnMouseDown

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

перемещение мыши OnMouseMove

нажатие клавиши OnKeyDown

отпускание клавиши OnKeyUp

нажатие символьной клавиши OnKeyPress

изменение размеров графического окна OnResize

закрытие графического окна OnClose

До начала работы программы эти переменные имеют нулевые значения.

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

Процедуры-обработчики имеют такие параметры:

OnMouseDown, OnMouseUp, OnMouseMove: - (x,y,mousebutton: integer);

OnKeyDown, OnKeyUp: - (key: integer);

OnKeyPress: - (ch: char);

OnResize, OnClose: - без параметров

Параметры x и y в обработчиках OnMouseDown, OnMouseUp и OnMouseMove определяют координаты курсора мыши в момент наступления события, параметр mousebutton равен 0, если кнопка мыши не нажата, 1, если нажата левая кнопка мыши, и 2, если нажата правая кнопка мыши. Параметр key в обработчиках OnKeyDownи OnKeyUp определяет виртуальный код нажатой клавиши. Параметр ch в обработчике OnKeyPress определяет нажатый символ. Если переменная-событие OnKeyPress имеет обработчик, то графическое окно не закрывается по нажатию клавиши Esc.

Н

procedure MouseDown(x,y,mb: integer);

begin

write(1);

end;

апример, если определена следующая процедура-обработчик, и в основной программе она привязана к соответствующей переменной-событию: OnMouseDown:=MouseDown; , то всякий раз при щелчке мышью в графическом окне в окно вывода будет выводиться 1.

Пример: Программа, осуществляющая движение графического окна с помощью клавиатуры.

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.

Использование таймеров

Таймеры позволяют выполнять указанное действие периодически через равные промежутки времени. Процедуры и функции для управления таймерами содержатся в модуле Timers.

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

Процедура StartTimer(n) запускает таймер с описателем n.

Процедура StopTimer(n) останавливает таймер с описателем n.

Процедура SetTimerInterval(n,ms) устанавливает у таймера с описателем n интервал в ms миллисекунд.

Функция TimerInterval(n) возвращает интервал у таймера с описателем n.

Функция TimerEnabled(n) возвращает True, если таймер запущен, и False в противном случае.

Процедура DestroyTimer(n) разрушает таймер с описателем n.

Для периодического вызова процедуры таймера необходимо после его создания продолжить выполнение приложения. Это можно сделать, подключив модуль Events.

П

uses Timers,Events;

procedure TimerProc1;

begin

write(1);

end;

procedure TimerProc2;

begin

write(2);

end;

var

t1,t2: integer;

begin

t1:=CreateTimer(200,TimerProc1);

t2:=CreateTimer(300,TimerProc2);

end.

ример: