Borland C ++ Builder 5 - Отмена с помощью Escape-клавиши Не работает
-
03-07-2019 - |
Вопрос
У меня довольно сложная проблема с обработчиком Escape-ключа в диалоговом окне Borland C ++ Builder 5.Существуют ли какие-либо другие требования к клавише Escape для запуска события отмены (кроме тех, которые я перечислил ниже)?
- Кнопка "Отмена" (TBitBtn) имеет свойство Cancel, равное true.
- Свойство кнопки "Отмена" по умолчанию имеет значение false.
- Кнопка "Отмена" имеет значение ModalResult, равное mrCancel.
Примечание:Я работаю со старым устаревшим приложением, которое все еще компилируется в Borland C ++ Builder 5.У нас есть отдельный проект по его замене - я просто провожу техническое обслуживание в конце срока службы.
Обновить
Четыре месяца спустя я, наконец, перестал царапать свой head...it оказывается, в родительской форме для приложения был определен обработчик OnShortCut во время выполнения.Мне просто нужно было отключить это, чтобы обработчик Esc работал в дочернем диалоговом окне.
Решение
Вы должны проверить все возможные способы блокировки события отмены:
Прежде всего, проверьте, действительно ли нажатие кнопки "Отмена" закрывает форму.
Затем проверьте, имеет ли свойство Отмены какой-либо другой кнопки значение true.
После этого проверьте все ключевые обработчики событий, не забудьте об обработчиках событий формы, особенно если у вас включен KeyPreview.
Если вы по-прежнему не обнаруживаете проблему, проверьте, установлено ли у другого компонента свойство ShortCut для обработки клавиши escape.
Также проверьте, активны ли какие-либо зацепки клавиатуры.
Другие советы
Возможно, свойству KeyPreview Формы присвоено значение true.Именно здесь клавиша Escape часто / скорее всего, была отключена.Свойство KeyPreview также часто включено для фиксации нажатия клавиши [Return] (т.е.OnKeyPress), чтобы перейти к следующему полю, а не закрывать форму.
Вы также можете создать другое диалоговое окно, добавить в него кнопку Отмены и посмотреть, работает ли клавиша Escape.Затем сравните источник DFM обеих форм и проверьте различия в настройках.
Существует ли событие типа "CanClose" с логикой, препятствующей его закрытию?
Также имейте в виду, что диалоговое окно должно вызываться через ShowModal(), а не просто Show() .Например, если ваша форма называется "FAskDialog", то код, который ее отображает, должен выглядеть следующим образом
FAskDialog-> ShowModal();
вместо того , чтобы
FAskDialog-> Показать();
Если диалоговое окно вызывается через Show(), то нажатие клавиши отмены или установка ModalResult = mrCancel НЕ приведет к закрытию диалогового окна.
это старый вопрос, я могу дать ответ:
Вам нужно установить KeyPreview = True, а затем написать код для захвата клавиши ESC:
Форма 1::OnKeyUp(...)
{
if (Ключ == 27) {
Закрыть();
}
}