2

Borland C++ Builder 5 のダイアログ ボックスの Escape キー ハンドラーでややこしい問題が発生しています。Escape キーがキャンセル イベントを発生させるための他の要件はありますか (以下にリストしたもの以外)?

  1. 「キャンセル」ボタン (TBitBtn) の Cancel プロパティは true に設定されています。
  2. [キャンセル] ボタンの Default プロパティは false に設定されています。
  3. 「キャンセル」ボタンの modalResult は mrCancel に設定されています。

注: 私はまだ Borland C++ Builder 5 でコンパイルされている古いレガシー アプリを使用しています。それを置き換える別のプロジェクトがあります。サポート終了のメンテナンスを行っているところです。

アップデート

4 か月後、ようやく頭を悩ませるのをやめました...アプリケーションの親フォームに実行時の OnShortCut ハンドラが定義されていることがわかりました。Esc ハンドラーが子ダイアログで機能するように、それを無効にする必要がありました。

4

6 に答える 6

4

キャンセル イベントがブロックされる可能性のあるすべての方法を確認する必要があります。

  1. まず、キャンセルボタンをクリックして実際にフォームが閉じられるかどうかを確認します。

  2. 次に、他のボタンの Cancel プロパティが true に設定されているかどうかを確認します。

  3. その後、すべてのキー イベント ハンドラーをチェックします。特に KeyPreview を有効にしている場合は、フォームのイベント ハンドラーを忘れないでください。

  4. それでも問題が見つからない場合は、別のコンポーネントの ShortCut プロパティがエスケープ キーを処理するように設定されているかどうかを確認してください。

  5. また、アクティブなキーボード フックがあるかどうかも確認します。

于 2008-12-30T21:07:18.587 に答える
1

別のダイアログを作成し、そのダイアログに[キャンセル]ボタンを追加して、エスケープキーが機能するかどうかを確認することもできます。次に、両方のフォームのDFMソースを比較し、設定の違いを確認します。

于 2009-01-02T09:53:03.297 に答える
1

また、ダイアログはShow()だけでなくShowModal()を介して呼び出す必要があることにも注意してください。たとえば、フォームの名前が「FAskDialog」の場合、フォームを表示するコードは次のようになります。

FAskDialog-> ShowModal();

それよりも

FAskDialog-> Show();

ダイアログがShow()を介して呼び出された場合、キャンセルキーを押すか、ModalResult = mrCancelを設定しても、ダイアログは閉じません。

于 2009-01-27T20:47:17.233 に答える
1

これは古い質問です。私は答えることができます:

KeyPreview = True を設定してから、ESC キーをトラップするコードを記述する必要があります。

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

于 2010-07-16T11:38:40.940 に答える
1

閉じるのを妨げるロジックを持つ「CanClose」タイプのイベントはありますか?

于 2009-01-18T14:12:01.460 に答える
1

Form の KeyPreview プロパティが true に設定されている可能性があります。これは、エスケープキーが無効になっていることが多い/可能性が高い場所です。KeyPreview プロパティは、多くの場合、[Return] キーの押下 (つまり OnKeyPress) をキャプチャして、フォームを閉じるのではなく次のフィールドに進みます。

于 2008-12-30T23:49:20.040 に答える