Маршрутизация событий
Как уже говорилось, любая программа, работающая в среде Turbo Vision, является прямым или косвенным (через TApplicatiori) потомком TProgram и основана на обращении к трем главным методам этого объекта: Init, Run и Done. Например:
Uses App,...;
type
TMyProgram = object (TApplication)
.....
end;
.....
var
MyProgram = TMyProgram;
.....
begin {Исполняемая часть программы:}
MyProgram.Init; {Инициировать программу}
MyProgram.Run; {Выполнить программу}
MyProgram.Done {Завершить работу}
end.
Процесс получения и обработки событий инициируется методом TProgram.Run, который для этого обращается к методу TGroup.Execute (любая .программа является потомком TGroup). Метод TGroup.Execute реализует следующий цикл:
var
Event: TEvent;
begin
Event.What := evNothing; {Инициировать пустое событие}
repeat {Основной цикл программы}
if Event.What <> evNothing then
EventError(Event); {Событие не очищено - ошибка}
GetEvent(Event); {Получить событие}
HandleEvent(Event); {Передать событие обработчику}
until EndState <> Continue;
.....
end;
Метод GetEvent наследуется всеми видимыми элементами от TView и является основным источником событий. Этот метод вначале проверяет, не подготовил ли событие метод PutEvent и, если это так, возвращает его. Затем GetEvent проверяет клавиатуру и мышь. Если какое-то из этих устройств изменило свое состояние, метод формирует и возвращает соответствующее событие. Если изменения не произошло, GetEvent обращается к методу TProgram.Idle, чтобы запустить «фоновую» задачу (подробнее об этом см. п. 18.6).
С помощью вызова метода TGroup.Execute события всегда начинают свой путь с модального видимого элемента. Напомню, что модальный элемент определяет точку диалога; в программе в каждый момент времени есть один и только один модальный элемент (см. п. 17.4). В самом начале программы таким элементом является обычно экземпляр объекта TProgram или его потомка. Если в программе открыто модальное диалоговое окно, оно обратится к TGroup.Execute и, следовательно, путь событий начнется с этого окна. В любом случае начинает обработку события метод HandleEvent модального видимого элемента. Дальнейший маршрут события зависит от того, является ли событие позиционированным, активным или общим.