Программные события

В ходе исполнения интерактивных процессов в предопределенных точках могут вызываться программные события, цель которых - выполнить работу, которую система не может выполнить автоматически. Некоторые события подменяют собой часть работы системы, например, позиционирование в мастере окна в событии OnConformToWindow. Другие дополняют работу системы, например выполняют контроль данных, вытекающий из прикладной логики - такое, например, часто делается в событии OnSuccessfulChange. События могут загружать окна, менять их свойства (см. FORM_WINDOW) и т.п.

Для большинства событий: транзакция программы совпадает с транзакцией активного процесса в RTI.CurZone, а если этот процесс не порождает и не наследует транзакцию модификации данных, то событие выполняется на транзакции видеосистемы.

Если исполняемый программный модуль и/или процедура не найдены, выдается соответствующее сообщение и считается, что событие завершилась с ошибкой, что обычно сопровождается сбросом очереди команд.

Можно определить группы программных событий:

  1. События перерисовки окна: OnConformToWindow, OnReposition, OnChangeIndex, OnRedraw. Вызываются в процессе выполнения видеоконформа. Окно, в котором такая программа завершится с ошибкой, автоматически закроется (очевидно, вместе с подчиненными окнами), а если там было интерактивное редактирование, оно завершится без сохранения изменений, о чем будет выдано сообщение. Закрывание верхнего окна сопровождается сбросом очереди команд.
    Такие события (кроме OnConformToWindow) могут выполняться в зоне, в которой нет процессов. В этом случае RTI.CurProcess имеет пустое значение, а RTI.Env содержит 0 элементов.
  2. Непрерываемые пользователем: OnSetSubwindow, OnInitializeWindow, OnInitializeZoneFilters, OnOpenWindow, OnCloseWindow, OnConformToWindow, OnReposition, OnOpenZone, OnChangeIndex, OnRedraw, OnGotFocus, OnSuccessfulСhange, OnBeforeAsk, OnAskPhase1, OnAskPhase2. По умолчанию установлен режим проверки ввода пользователя CUI_OFF. Режим может быть изменен атрибутом TRY-блока CHECK_USER_INPUT.
  3. Настраивающие режим видеопроцесса: OnOpenWindow, OnBeforeEdit, OnBeforeInsert, OnSetSubwindow (кроме вызова на старте ShowWin). Процедура GRANTALLRIGHTS и модификация свойства TRY_BLOCK.AccessDataMode, выполненная вне TRY-блока, распространяют свое действие не только на исполняемую программу, но и на работу собственного процесса и будущих процессов транзитивно подчиненных зон.
  4. Связывающие зоны двух окон: OnConformToWindow, OnAskPhase1, OnAskPhase2. Имеют непустые RTI.TrgWindow и RTI.TrgZone.
  5. Имеющие на старте позицию RTI.CurZone в соответствующем программном курсоре (выполнение ACCESS при доступе к этой записи не требуется), причем заблокированную по обычному правилу ASL. Это события, в которых такая позиция гарантированно определена: OnSetSubwindow кроме интерактивной вставки, OnConformToWindow, а также OnReposition в панельной зоне.
  6. Сопровождающие загрузку окна: OnInitializeWindow, OnInitializeZoneFilters.
    1. Вызывается когда окно переходит из состояния заготовки в состояние подготовленного окна. Это происходит при выполнении метода FORM_WINDOWS.Load или при запуске первого видеопроцесса в окне, в любой из следующих ситуаций:
      1. Окно-оригинал или копия загружается с диска впервые в данном сеансе или выполняется их перезагрузка с диска
      2. Загруженное окно имело состояние заготовка
      3. Загружается клон окна, а в памяти нет подготовленного окна-оригинала. Тогда сначала загружается и подготавливается оригинал, что сопровождается программными событиями данной группы, затем копированием в памяти создается окно-клон уже без выполнения программных событий.
    2. Выполняются всегда на жесткой независимой транзакции.
    3. Ни в одной из зон окна нет выполняющихся процессов.
    4. RTI.CurProcess не пуст и содержит фиктивный процесс типа Kind_Dummy. Служит для хранения Env, который в этих событиях доступен только по чтению, иначе исключение 144.
    5. Если событие - есть следствие метода FORM_WINDOWS.Load, значения атрибутов MSG_SUPPRESSION и TERM_BY_USER TRY-блока наследуются от вызывающей программы.
    6. Если программа завершается с ошибкой, то окно не загружается,  что сопровождается сбросом очереди команд.

События, обрабатываемые ASL-модулями:

Если иное не оговорено особо, каждое программное событие вызывается, если имя соответствующей программы-обработчика имеет непустое значение и включен флаг необходимости вызова события. Имена этих программ и соответствующие флаги задаются редактором WED и хранятся в WDO-окне, а также могут быть изменены программно. RTI.StartMode специфично для каждого программного события данной группы.

Программы уровня окна FORM_WINDOW.WLevProg:

Программы уровня зоны FORM_ZONE.ZLevProg:

Программы уровня записи FORM_ZONE.RLevProg:

Программы уровня поля FORM_ZONE.FLevProg:

События, обрабатываемые ASL-процедурами или функциями:

Имя процедуры-обработчика хранится в одноименном свойстве класса APP. Формат имени - "Module.Procedure", где Procedure - это процедура или функция модуля Module. Программное событие вызывается, если имя соответствующей процедуры-обработчика имеет непустое значение, значение по умолчанию у них - пустое. RTI.StartMode для всех программных событий данной группы имеет значение 999.

События, обрабатываемые ASL-процедурами без параметров:

События, обрабатываемые ASL-функциями: