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

StackOverflow https://stackoverflow.com/questions/400903

  •  03-07-2019
  •  | 
  •  

Вопрос

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

  1. Кнопка "Отмена" (TBitBtn) имеет свойство Cancel, равное true.
  2. Свойство кнопки "Отмена" по умолчанию имеет значение false.
  3. Кнопка "Отмена" имеет значение ModalResult, равное mrCancel.

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

Обновить

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

Это было полезно?

Решение

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

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

  2. Затем проверьте, имеет ли свойство Отмены какой-либо другой кнопки значение true.

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

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

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

Другие советы

Возможно, свойству 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) {
Закрыть();
}
}

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top