Маршрутизация событий
Как уже говорилось, любая программа, работающая в среде 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 модального видимого элемента. Дальнейший маршрут события зависит от того, является ли событие позиционированным, активным или общим.