понедельник, 8 апреля 2013 г.

Модуль Events

1. Обзор 

Модуль 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. Измените программу таким образом, чтобы при закрытии окна трижды менялся его цвет (случайным образом).


5 комментариев:

  1. Это прекрасно, пойду, что ли, калькулятор сделаю

    ОтветитьУдалить
  2. объяснить бы как это работает! Особенно с клавишами!

    ОтветитьУдалить
  3. Перед телом программы описываешь процедуру с нужным количеством параметров (имя процедуры может быть любым), например:

    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

    ОтветитьУдалить
  4. А как сделать так, чтобы у меня фигура двигалась, когда я жму на кнопку мыши?

    ОтветитьУдалить