Как отключить клавишу Esc в процессе ввода

Тимоти А. Каллахен (Timothy A. Callahan)

Команды SET ESCAPE и ON ESCAPE предлагают технику обработки нажатия клавиши Esc во время исполнения программы. При нажатии Esc во время исполнения кода срабатывает модуль или команда, связанные с предложением ON ESCAPE при условии, что SET ESCAPE ON. Однако, когда ваша программа ожидает ввода от пользователя, нажатие Esc приводит к иным результатам. В этом случае ON ESCAPE не годится. Кроме того, это вообще-то ваша проблема, так как READ ожидает ввода пользователя. Как легко выяснить, Esc по умолчанию прерывает действие READ. Возможные решения:

Используйте команду ON KEY LABEL ESCAPE. Это похоже на ON ESCAPE за тем исключением, что ON KEY LABEL... перехватывает нажатие клавиши ESCAPE во время ожидания ввода пользователя. ON KEY LABEL... не прерывает исполнения программы. Я не рекомендовал бы использовать и ON ESCAPE и ON KEY LABEL ESCAPE. Эти две команды взаимно исключают друг друга.

Если в экранной форме у вас есть кнопка Cancel, определите ее как кнопку, реагирующую на нажатие Esc (\?).

Используйте блок кода в предложении VALID для обработки Esc:

      IF LASTKEY() = 27  WAIT WINDOW ;
       "Escape pressed!" NOWAIT
         DO resetkey  
         * Чтобы LASTKEY больше 
         * не возвращала 27
         RETURN .F.  && остаемся
      ENDIF
      RETURN .T.  && выходим

Используйте функцию READKEY() (это вступил Марк Уотерс /Mark Waters/). Эта функция возвращает значение, соответствующее клавише, нажатой для выхода из READ. Кроме того, она возвращает 3, если пользователь активизировал объект, завершающий выполнение READ (termination control). Я использую следующий код в функции проверки ввода, он позволяет мне выйти только по нажатию клавиши Cancel.

      IF READKEY(1) # 3 
      * не прерываем работу, если не выбрана
      * клавиша, завершающая READ
         RETURN .f.
      ENDIF
Hosted by uCoz