Borland C ++ Builder 5-エスケープキーによるキャンセルが機能しない
-
03-07-2019 - |
質問
Borland C ++ Builder 5のダイアログボックスのEscapeキーハンドラーでややこしい問題があります。Escapeキーでキャンセルイベントを起動するためのその他の要件はありますか(以下にリストしたもの以外)
- 「キャンセル」ボタン(TBitBtn)のCancelプロパティはtrueに設定されています。
- 「キャンセル」ボタンのDefaultプロパティはfalseに設定されています。
- 「キャンセル」ボタンのmodalResultはmrCancelに設定されています。
注: 私はまだBorland C ++ Builder 5でコンパイルされている古いレガシアプリを使用しています。それを置き換える別のプロジェクトがあります-私はちょうど終末期のメンテナンスをしています。
更新
4か月後、私はようやく頭を悩ませるのをやめました...アプリケーションの親フォームには、実行時のOnShortCutハンドラーが定義されていました。 Escハンドラーが子ダイアログで機能するように、それを無効にする必要がありました。
解決
キャンセルイベントがブロックされる可能性のあるすべての方法を確認する必要があります。
-
まず、キャンセルボタンをクリックしてフォームを実際に閉じるかどうかを確認します。
-
次に、他のボタンのCancelプロパティがtrueに設定されているかどうかを確認します。
-
すべての主要なイベントハンドラーを確認したら、特にKeyPreviewを有効にしている場合は、フォームのイベントハンドラーを忘れないでください。
-
まだ問題が見つからない場合は、別のコンポーネントのエスケープキーを処理するShortCutプロパティが設定されているかどうかを確認してください。
-
アクティブなキーボードフックがあるかどうかも確認します。
他のヒント
フォームのKeyPreviewプロパティがtrueに設定されている可能性があります。 これは、Escapeキーが無効にされている可能性が高い場所です。 KeyPreviewプロパティは、フォームを閉じるのではなく、次のフィールドに進むために[Return]キーの押下(つまりOnKeyPress)をキャプチャすることもできます。
別のダイアログを作成し、キャンセルボタンを追加して、エスケープキーが機能するかどうかを確認することもできます。次に、両方のフォームのDFMソースを比較し、設定の違いを確認します。
「CanClose」はありますか閉じられないようにするロジックを持つイベントを入力しますか?
ダイアログは、Show()ではなくShowModal()を介して呼び出す必要があることにも注意してください。たとえば、フォームの名前が" FAskDialog"の場合、それを表示するコードは次のようになります
FAskDialog-> ShowModal();
ではなく
FAskDialog-> Show();
Show()を介してダイアログが呼び出された場合、キャンセルキーを押すか、ModalResult = mrCancelを設定しても、ダイアログは閉じません。
これは古い質問です。答えを出すことができます:
KeyPreview = Trueに設定してから、ESCキーをトラップするコードを記述する必要があります。
Form1 :: OnKeyUp(...)
{
if(Key == 27){
Close();
}
}