Borland C ++ Builder 5 - отмена с помощью клавиши Escape не работает - PullRequest
2 голосов
/ 30 декабря 2008

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

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

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

Обновление

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

Ответы [ 6 ]

4 голосов
/ 31 декабря 2008

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

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

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

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

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

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

1 голос
/ 16 июля 2010

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

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

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

1 голос
/ 27 января 2009

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

FAskDialog-> ShowModal ();

вместо

FAskDialog-> Show ();

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

1 голос
/ 18 января 2009

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

1 голос
/ 02 января 2009

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

1 голос
/ 31 декабря 2008

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

...