Событийно-управляемая модель программирования

Приложение с GUI отличается от консольного наличием графического интерфейса (напомню, что консольное приложение использует экран в текстовом режиме, а приложение с GUI в графическом режиме). Но между консольным и GUI — приложением существует еще одно, более существенное различие. Консольное приложение, получив управление, далее полностью само контролирует вычислительный процесс. По мере необходимости запрашивает данные для работы (оператор read), выводит результаты вычислений на экран (оператор writeln) и завершает работу по достижению последнего оператора программы.

Совершенно по-другому работают GUI — программы. Они реагируют на события. Событие может вызвать действие пользователя, например, нажатие мышью на какую-нибудь кнопку в приложении. Событие может вызвать операционная система или же событие может породить само приложение. Все события отслеживаются операционной системой, которая формирует на каждый тип события соответствующее сообщение. Это сообщение передается в приложение, на которое приложение должно реагировать в соответствии с алгоритмом своей работы. Т.е. GUI — приложение должно уметь обрабатывать сообщения операционной системы и уметь генерировать и посылать свои собственные сообщения.

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

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

В таблице 1 приведены некоторые события и условия, при которых они возникают. Исходя из таблицы 1 для некоторого окна может быть создано девять процедур для обработки событий. Например, процедура по обработке события OnCreate (создание окна) может в это время выполнить некоторые подготовительные операции, такие как открытие файлов, инициализацию некоторых переменных и т.д.

Разумеется, не обязательно писать обработчики событий для всех возможных событий. В этом случае, если отсутствует обработчик какого-нибудь события, то это событие просто не будет обработано вашим приложением. Например, если в приложении отсутствует обработчик события OnKeyDown, то на нажатие клавиш на клавиатуре приложение будет реагировать стандартным образом, например при нажатии Alt+F4 окно приложения будет закрыто.

Таблица 1

No п/п

Событие

Когда возникает

1.

OnCreate

Событие возникает при создании окна и только один раз.

2.

OnShow

Это событие генерируется непосредственно перед тем, когда окно станет видимым.

3.

OnActivate

Это событие генерируется, когда окно становится активным, то есть когда получает фокус ввода.

4.

OnPaint

Это событие возникает каждый раз при перерисовке окна.

5.

OnReSize

Это событие возникает каждый раз при изменении размеров окна.

6.

OnClose

Событие возникает при закрытии окна.

7.

OnKeyDown

Событие наступает при нажатии любой клавиши.

8.

OnKeyPress

Событие наступает при нажатии клавиши символа.

9.

OnKeyUp

Событие возникает при отпускании любой клавиши.

Компонентно-ориентированный подход

Компоненты (components) это специальные классы, свойства которых представляют атрибуты объектов, а их методы реализуют операции над соответствующими экземплярами компонентных классов.

Среда разработки позволяет манипулировать видом и функциональным поведением компонент не только с помощью методов, но и посредством свойств и событий, присущих только классам компонент.

Каждый компонент, который Вы помещаете на форму, имеет свое отражение в окне Инспектора Объектов (Object Inspector). Object Inspector имеет две «странички» — «Properties» (Свойства) и «Events» (События). Создание программы в Lazarus сводится к «нанесению» компонент на форму (которая, также является компонентом) и настройке взаимодействия между ними путем:

  • изменения значения свойств этих компонент

  • написания адекватных реакций на события.

Такой способ (метод) создания приложений называется событийный, компонентно — ориентированный подход.