
- •Объекты и события в turbo vision.
- •Глава 1. Объекты TurboVision.
- •Глава 2. События.
- •Глава 3. Взаимодействие видимых элементов.
- •Введение
- •Глава 1. Объекты turbo vision.
- •Иерархия объектов TurboVision. Принципы построения иерархии.
- •Примитивные типы объектов. Система координат TurboVision.
- •Видимые элементы.
- •Взаимосвязи между видимыми элементами.
- •Поля State и Options.
- •Выбор и активизация видимых элементов.
- •Глава 2. События.
- •Чтение ввода пользователя.
- •Виды событий.
- •События-сообщения. Команды. Разрешение и запрещение команд.
- •Запись события. Тип tEvent.
- •Цикл событий. Функция Execute.
- •Методы GetEvent и PutEvent. Централизация сбора событий.
- •Обработка событий. Метод HandleEvent.
- •Маршрутизация событий. Переменные FocusedEvents и PositionalEvents. Поле EventMask.
- •Глава 3. Взаимодействие видимых элементов.
- •Посредники.
- •Сообщения между видимыми элементами.
- •3. Кто обрабатывает общие сообщения.
- •4. Вызов процедуры HandleEvent.
Цикл событий. Функция Execute.
Обработку событий всегда начинает модальный видимый элемент.
Модальный видимый элемент, в том числе и программа, получает и обрабатывает события, используя функцию Execute (TProgram.Run вызывает наследуемый метод TGroup.Execute). Функция Execute – это основной цикл событий модального элемента: в нем элемент периодически получает события с помощью процедуры GetEvent и обрабатывает их, вызывая свой метод HandleEvent:
function TGroup.Execute: Word;
var E: TEvent;
begin
…
EndState := 0;
repeat
GetEvent(E); { Получение события }
HandleEvent(E); { Обработка события }
if E.What <> evNothing then EventError(E);
until EndState <> 0;
{ EndState – private поле в TGroup, которое изменяется в процедуре EndModal для завершения модального состояния }
…
end; .
Процедура GetEvent возвращает следующее доступное событие, а процедура HandleEvent должна обработать его сама, либо передать для обработки другим видимым элементам программы. Если событие не было обработано методом HandleEvent (т.е. оно непустое), то вызывается метод EventError для сигнализации о ненужном событии.
Методы GetEvent и PutEvent. Централизация сбора событий.
Каждый видимый элемент может получать события, используя наследуемый от TView виртуальный метод GetEvent(var Event: TEvent). Этот метод возвращает в параметре Event следующее доступное событие. TView.GetEvent просто вызывает GetEvent своего владельца; так же функционируют методы GetEvent всех потомков TView, кроме TProgram. Таким образом, вызов GetEvent любого элемента приводит в конечном итоге к вызову TProgram.GetEvent (TApplication наследует GetEvent от TProgram), который перекрывает TView.GetEvent для действительного получения событий.
Метод PutEvent(var Event: TEvent) используется видимыми элементами для генерации событий. Аналогично GetEvent, TView.PutEvent вызывает PutEvent владельца. TProgram.PutEvent сохраняет копию записи события Event в буфере, и при следующем обращении к GetEvent будет возвращено это событие (буфер может содержать только одно событие). Объекты меню и кнопки используют PutEvent для генерации команд, ассоциированных с ними.
TProgram.GetEvent сначала проверяет, не было ли сгенерировано событие с помощью PutEvent, и, если так, то возвращает это событие. Если такого события нет, то выполняется процедура GetMouseEvent для получения события от мышки. Если GetMouseEvent возвращает пустое событие, вызывается GetKeyEvent для получения события от клавиатуры. В случае, когда обе процедуры возвращают evNothing, указывая, что нет ввода от пользователя, GetEvent вызывает процедуру TProgram.Idle для выполнения фоновых задач (напр., обновление строки статуса). До возврата GetEvent передает все события evKeyDown и evMouseDown в строку статуса, благодаря чему строка статуса всегда остается активной, независимо от модального элемента.
В программе на TurboVision получение событий происходит только в одном месте, в TProgram.GetEvent. Централизация сбора событий позволяет легко ввести в программу новые виды событий (напр., чтение символов из последовательного порта) – для этого достаточно перекрыть метод TApplication.GetEvent. С точки зрения остальной программы, поток событий будет приходить прямо от пользователя.
Другое преимущество управляемого событиями программирования состоит в том, что код не должен знать, откуда поступают события. Например, объект TWindow должен знать только, как реагировать на команду закрытия окна cmClose, но ему совершенно безразлично, откуда поступила команда.