Программы уровня видеополя.

OnGotFocus

OnSuccessfulChange

OnBeforeAsk

События "начало/окончание Ask".

Непрерываемые программные события вызываются при работе явного Ask или ручного Ask. Эти события необходимы для эмуляции связи со справочным файлом, когда такая связь не является системной.

Общее для этих событий:

  1. RTI.CurWindow и RTI.CurZone содержат соответственно окно и зону, откуда вызван процесс Ask.
  2. Транзакцию определяет зона RTI.CurZone.
  3. В Event.Env находятся переменные окружения обслуживаемого процесса Ask.

Событие OnAskPhase1 - "начало Ask" вызывается на этапе позиционирования в справочном окне. Основная задача программы - переопределить работу системы по выполнению позиционирования в рабочей зоне справочного окна.

Особенности такой программы:

  1. RTI.StartMode: 248 при ручном Ask из процессов View, Ask, ShowWin; 251 при ручном Ask из процессов Edit и Ins; 245 при явном Ask.
  2. Ask выполняется на копии окна, имя которого формируется так.
  3. RTI.TrgWindow и RTI.TrgZone содержат соответственно справочное окно и зону.
  4. Чтобы выполнить позиционирование в рабочей зоне процесса Ask, нужно каким-либо способом установить позицию в программном курсоре файла-мастера зоны Ask, например с помощью процедуры SEARCH, после чего вызвать процедуру переноса позиции программного курсора в курсор справочной зоны, например, с помощью SE_WZD_POSITION:
    SE_WZD_POSITION(RTI.TrgWindow.Name, RTI.TrgZone.Number, Master);
  5. Если такая программа завершится с ошибкой, выполнение процесса Ask прерывается, что сопровождается сбросом очереди команд.

Событие OnAskPhase2 - "окончание Ask" вызывается на последнем этапе работы процесса Ask, когда нужно воспользоваться выбранной в процессе его работы записью. Ask-процесс еще не завершился, и справочное окно - верхнее. Основная задача программы - переопределить работу системы и воспользоваться выбранной справочной записью.

Особенности такой программы:

  1. RTI.StartMode: 249 при ручном Ask из процессов View, Ask, ShowWin; 252 при ручном Ask из процессов Edit и Ins, 246 при явном Ask.
  2. RTI.TrgWindow и RTI.TrgZone содержат соответственно справочное окно и зону, где выполнен EnterCur. Т.о. RTI.TrgZone в общем случае - зона производного Ask.
  3. Программный курсор мастера текущей зоны справочного окна содержит выбранную запись, а если зона главного процесса Ask имеет другой мастер, то соответствующий программный курсор имеет текущую запись этой зоны, причем заблокированы записи по обычным правилам, т.е. выполнение ACCESS не требуется.
    По общему правилу, программный курсор мастера исходной зоны на старте программы содержит позицию этой зоны. Если мастера исходной и справочной зон совпадают (иерархический справочник), то программный курсор на старте имеет позицию исходной зоны (до V14.201.100 имел позицию справочной).
  4. Если Ask был вызван из процессов View или Ask, то данная программа скорее всего должна выполнить позиционирование в курсоре исходной зоны RTI.CurZone на основе значений полей выбранной справочной записи. Для этого нужно установить позицию в программном курсоре файла-мастера этой зоны, например с помощью процедуры SEARCH, после чего вызвать процедуру переноса позиции программного курсора в курсор зоны, например, с помощью SE_WZD_POSITION.
    Если Ask был вызван из процессов Edit или Ins, то данная программа скорее всего должна изменить значение редактируемого поля на основе значений полей выбранной справочной записи. Для этого соответствующему полю программного курсора мастера зоны RTI.CurZone нужно присвоить новое значение, после чего вызвать REPLACE. Результат такого REPLACE-а система воспринимает аналогично введенному вручную значению редактируемого поля, и после успешного завершения события "окончание Ask" выполняет стандартные действия по обработке этого полученного значения, такие как: различные проверки корректности нового значения, вызов программного события OnSuccessfulChange и т.п. REPLACE в данном событии следует выполнять при включенном контроле целостности БД, т.к. именно он и выполняет основную работу.
  5. Если такая программа завершится с ошибкой, то выбранная справочная запись никак не используется, как будто в Ask и не входили, что сопровождается сбросом очереди команд. Процесс Ask при этом не завершается.