1

Тема: Подтверждение закрытия формы ввода / коррекции

При закрытии формы ввода / коррекции
- при нажатии на кнопку закрытия модального окна,
- при нажатии клавиши Esc
- при нажатии кнопки "Выйти" на форме
возникла необходимость подтверждения выхода из формы по причине корректировки многих записей и для предотвращения случайного выхода.

Для этого было предложено использовать макрос
"Контроль закрытия формы EditScreen"

/*****Контроль закрытия формы EditScreen*****/
oDlg:keyboard := {|x,y,o| ;
  IF(x=27.AND.SetAlert(;
    ,{;
      IF(cLangID=[ru];
       ,'Отменить ввод/коррекцию ?';
       ,"Відмінити ввод/корекцію ?");
     };
    ,{;
      IF(cLangID=[ru];
       ,'Отменить';
       ,"Відмінити");
      ,IF(cLangID=[ru];
       ,'Продолжить';
       ,"Продовжити");
     };
  )=1;
  ,CommonKeyboardBlock(x,.T.,o);
  ,);
}

oDlg:close := {|x,y,oForm|  ;
  IF(SetAlert(;
    ,{;
      IF(cLangID=[ru];
       ,'Отменить ввод/коррекцию ?';
       ,"Відмінити ввод/корекцію ?");
     };
    ,{;
      IF(cLangID=[ru];
       ,'Отменить';
       ,"Відмінити");
     ,IF(cLangID=[ru];
       ,'Продолжить';
       ,"Продовжити");
     };
  )=1;
  ,(oForm:lLoopEditScreen := .F., lSuccess := .F., nIni := NIL, IF(oForm:lModal,,oForm:destroy()));
  ,.F.);
}
/*******************************************/

В INI-файле формы данный макрос применялся следующим образом

/**************INI-файл формы***************/
BEFORECOMP=410,["411,'Контроль закрытия формы EditScreen'"]\
BEFOREBLOCK=oDocObj:=SpViewDoc():oCurrentDoc,RunFevalFromEditor("Контроль закрытия формы EditScreen",)
/*******************************************/

Но при тестировании диалог подтверждения при нажатии клавиши Esc появлялся лишь находясь на текстовом поле.
Однако на полях выбора ОАУ, полях выбора из массива, кнопках "Ввести" / "Выйти" подтверждения не было.
Блок кода oDlg:keyboard в макросе не срабатывал.

Также данный макрос не обрабатывал случай выхода по нажатию кнопки "Выйти" на форме.

Прошу помочь разобраться с подтверждением при выходе с формы ввода / коррекции для любых попыток выхода.

2

Re: Подтверждение закрытия формы ввода / коррекции

Добрый день.
Немного нестандартное предложение, которое конечно можно реализовать, но нельзя сказать, что текст очень уж прозрачный получается sad, т.к. это не было заложено изначально. Вкратце - мы переопределяем еще обработчик ::keyboard для всех кнопок формы:

/* Кнопки Ввести/Выйти */
oDlg:aPushBtn[1]:keyboard := {|x,y,oBtn| IF(x<>27.OR.SetAlert(,{'Отменить ввод/коррекцию ?'},{'Отменить','Продолжить'})<>1,PushButtonBlock(x, oBtn),)}
oDlg:aPushBtn[2]:keyboard := {|x,y,o| IF(x=13.OR.x=32,(nIni:=NIL, lSuccess:=(IF(GetParentForm(o):lModal,,GetParentForm(o):destroy()),GetParentForm(o):lLoopEditScreen:=.F.)),;
                                      IF(x<>27.OR.SetAlert(,{'Отменить ввод/коррекцию ?'},{'Отменить','Продолжить'})<>1,CommonKeyboardBlock(x,.T.,o),)) }

/* Кнопки элементов управления */
i:=0
DO WHILE ++i<=LEN(oDlg:aPush)
   IF .NOT.EMPTY(oDlg:aPush[ i ])
      oDlg:aPush[ i ]:keyboard := {|x,y,o| IF(x<>27.OR.SetAlert(,{'Отменить ввод/коррекцию ?'},{'Отменить','Продолжить'})<>1,;
                                            (IF(!o:isDerivedFrom('XbpCheckBox').AND.!o=oDlg:Ctrl:thisxbp.AND.VALTYPE(x)="N".AND.(.NOT.oDlg:Ctrl:continue),oDlg:Ctrl:continue:=.T.,oDlg:Ctrl:keyboard( x, y, o ))),) }
   ENDIF
ENDDO

Естественно, переменную i надо вверху объявить как LOCAL

3

Re: Подтверждение закрытия формы ввода / коррекции

Все работает! Спасибо за помощь.