Borland C++ Builder 5 - Отмена с помощью клавиши Escape не работает

У меня довольно сложная проблема с обработчиком клавиши Escape в диалоговом окне в Borland C++ Builder 5. Существуют ли какие-либо другие требования к клавише Escape для запуска события отмены (кроме тех, которые я перечислил ниже)?

  1. Для кнопки «Отмена» (TBitBtn) свойство Cancel имеет значение true.
  2. Для кнопки «Отмена» свойство по умолчанию установлено в false.
  3. У кнопки «Отмена» для параметра modalResult установлено значение mrCancel.

Примечание. Я работаю со старым устаревшим приложением, которое все еще компилируется в Borland C++ Builder 5. У нас есть отдельный проект для его замены — я просто выполняю техническое обслуживание в конце срока службы.

Обновить

Четыре месяца спустя я, наконец, перестал ломать голову... оказалось, что в родительской форме для приложения был определен обработчик OnShortCut во время выполнения. Мне просто нужно было отключить это, чтобы обработчик Esc работал в дочернем диалоговом окне.


person Will Bickford    schedule 30.12.2008    source источник
comment
Проверьте обработчики событий формы — OnCloseQuery, OnKeyDown и OnKeyPress могут заблокировать это.   -  person Craig Stuntz    schedule 30.12.2008


Ответы (6)


Вы должны проверить все возможные способы блокировки события отмены:

  1. Прежде всего, проверьте, действительно ли нажатие кнопки «Отмена» закрывает форму.

  2. Затем проверьте, установлено ли для любой другой кнопки свойство Cancel равным true.

  3. После этого проверьте все обработчики ключевых событий, не забудьте обработчики событий формы, особенно если у вас включен KeyPreview.

  4. Если проблема не устранена, проверьте, не установлено ли для другого компонента свойство ShortCut для обработки управляющей клавиши.

  5. Также проверьте, активны ли какие-либо клавиатурные хуки.

person Daniel Rikowski    schedule 30.12.2008
comment
1. да, работает. 2. нет 3. эта конкретная форма не имеет определенных обработчиков ключевых событий, спасибо за указатели - person Will Bickford; 02.01.2009
comment
Примечание. Если вы определяете пользовательскую кнопку «Отмена» для возврата MrCancel, вы также должны установить для свойства «Отмена» значение true. - person Will Bickford; 22.07.2011

Возможно, для свойства KeyPreview формы установлено значение true. Именно здесь клавиша Escape часто/вероятно отключена. Свойство KeyPreview также часто используется для захвата нажатия клавиши [Return] (например, OnKeyPress) для перехода к следующему полю, а не для закрытия формы.

person Roger Nelson    schedule 30.12.2008

Вы также можете создать другое диалоговое окно, добавить в него кнопку «Отмена» и посмотреть, работает ли клавиша Escape. Затем сравните исходник DFM обеих форм и проверьте различия в настройках.

person Riho    schedule 02.01.2009

Есть ли событие типа "CanClose" с логикой, предотвращающей его закрытие?

person Ray Hayes    schedule 18.01.2009

Также имейте в виду, что диалог должен вызываться с помощью ShowModal(), а не просто Show(). Например, если ваша форма называется «FAskDialog», тогда код, который ее отображает, должен выглядеть примерно так:

FAskDialog->ShowModal();

скорее, чем

FAskDialog->Показать();

Если диалог вызывается через Show(), то нажатие клавиши отмены или установка ModalResult = mrCancel НЕ приведет к закрытию диалога.

person Kluge    schedule 27.01.2009
comment
Это тоже проверил - к сожалению, используется ShowModal. Спасибо хоть. - person Will Bickford; 02.02.2009

это старый вопрос, я могу дать ответ:

Вам нужно установить KeyPreview = True, а затем написать код для перехвата клавиши ESC:

Form1::OnKeyUp(...)
{
if (Key == 27) {
Close();
}
}

person buttercup    schedule 16.07.2010