Маршрутизация событий

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