Обработчики событий |
Основным звеном механизма событий является обработчик событий. Обработчик событий служит для программирования реакции прикладной системы на действия конечного пользователя.
Обработчик событий создается в интерфейсе. Область действия обработчика событий ограничивается интерфейсом, в котором он создан.
<обработчик-событий> = (handleEvent | tableEvent table <таблица> | windowEvent <имя-окна>) {{<событие><событие> : <оператор-программы>} [always <оператор-программы>] end;
handleEvent - обработчик, получающий все события.
tableEvent table - обработчик, получающий только табличные события от указанной таблицы.
<таблица> - таблица, события от которой будут обрабатываться в данном обработчике.
windowEvent - обработчик, получающий только оконные события указанного окна.
<имя-окна> - окно, события которого будут обрабатываться в данном обработчике.
<событие> - идентификатор одного из событий системы.
<оператор-программы> - программа обработки данного события.
В случае если одно и тоже событие указано несколько раз, программы его обработки вызываются по очереди в порядке их написания.
Между идентификатором события и оператором обработки стоит двоеточие.
Секция always будет вызываться для любой команды в обработчике независимо от наличия секции для обработки текущей команды. Для получения текущей команды можно использовать метод интерфейса CurCommand.
Обработчик событий может содержать операторы обработки нескольких событий. События разделяются точкой с запятой. Количество обрабатываемых событий не более 16000.
Обработчик событий устроен следующим образом. Сначала вызывается обработка событий, запрограммированная в разделе handleEvent, затем - стандартный обработчик. Если для данного события существует стандартная обработка события, то ее можно отменить, вызвав процедуру Stop.
Если во время обработки события обнаружена ошибка, то, вызвав процедуру Abort, можно добиться установки статуса ошибки при обработке события.
Вызов методов Abort или Stop не приводит к завершению выполнения обработчика событий. Для этого следует использовать оператор exit.
См. также "Команды, обрабатываемые стандартным приложением".
Пример 1.
handleEvent cmPositionChanged : {} cmInit : {} always { Message (String (CurCommand)); // так не делать-зациклится! } cmSetDefault : name := 'Новый сотрудник'; cmInsertRecord : insert current employee; cmDeleteRecord : if (Message('Удалим информацию о сотруднике?',YesNo)=cmYes) delete current employee; end;
Пример 2.
browse EmpBrowse table Employee; show at (,,,10); fields Employee.Name end; browse EmpProjBrowse table empproj show at (,11); fields Project.Name end; tableEvent table Employee cmUpdateRecord : update current employee; cmInsertRecord : insert current employee; cmDeleteRecord : delete current employee; end; tableEvent table EmpProj cmUpdateRecord : update current empproj; cmInsertRecord : insert current empproj; cmDeleteRecord : delete current empproj; cmPick : RunInterface(GetProject,EmpProj.cProject); end;