2009-04-20 14 views
4

私はいつでもEscキーを押すことで現在のフォームを閉じるために多くのことを、これを使用している:TEditがフォーカスされている間にエスケープを押したときの鳴き声を避けるには?私は数年前に開発したコードでは

procedure TSomeForm.FormKeyPress(Sender: TObject; var Key: Char); 
begin 
    if key = #27 then close; 
end; 

この動作はTFormはのために定義されています。フォームのKeyPreviewプロパティはTrueに設定され、フォームが他のコンポーネントの前にキー入力に反応するようにします。しかし、プログラムの最善の部分では完全にうまく動作しますが、TEditコンポーネントにフォーカスが当たっている間にエスケープキーを押すと、無効操作を示すためにWindowsが使用するサウンドが発行されます。それはまだうまく動作しますが、私は決して音を取り除くことはできませんでした。

この問題は何ですか?再現する


ステップ:

  • 新しいVCLフォームアプリケーション、onKeyPressイベントのイベントをダブルクリックして、ダミーのコードを入力し、[イベント]タブで、真
  • にフォームのKeyPreviewの設定:

    キーが#27の場合

    ;

  • は、フォームにTListBoxコンポーネント、TCheckBox、TEDITを追加し、Escキーを押してアプリケーション内のアプリケーション

  • を試しに実行し、ダミーコード
  • フォーカスTEDITとEscキーを押しによって指定され何も起こりません。何も起こりませんが、サウンドが再生されます。

答えて

20

あなたは入力にESCを残しているので、あなたは魔法使いを得る。 Keyはどのようにvarのように表示されますか?それを#0に設定すると、鳴き声が消えます。それにより、それはさらなる処理から取り除かれます。

procedure TSomeForm.FormKeyPress(Sender: TObject; var Key: Char); 
begin 
    if key = #27 then 
    begin 
     key := #0; 
     close; 
    end; 
end; 

KeyPreviewのはそういうことだ、あなたはそれを停止しない限り、コントロールに渡されるもののプレビュー。

+0

これは私には言葉を残す...私は厳しいナットを割ったが、これは... aaaahhhh。アドバイスをいただきありがとうございます。とても感謝しております。 –

+0

それは私たちすべてに起こります。いつでも、私はそれが盲目的に単純なものになるだろうと知っている間、私は少しずつバグで戦っています。それはちょうどそれが動作する方法です。 –

0

これは古いスレッドですが...とにかくここではるかに優れています:キャッチするAlt-C

ESCとは異なり、Alt-CはKeyPressによって処理されないため、KeyPressでKeyを#0に設定すると機能しません。また、恐ろしい "ding!"毎回発行されます。 試しに試してみたところ、次のような回避策があります: - - ショートカットをAlt + Cに設定しました - 確かに利用可能なShortCutの選択肢のうちの一つではありません(メインメニューオプションを作成してください! )...しかしそれはとにかく働く! - そのメニューオプションのOnClick で処理を行います - あなたは "バックグラウンドで"作成することもできます:メニューオプションのVisibleをfalseに設定することができます - Enabledがtrueのままであれば、Alt-メニューには表示されません。

希望すると助かります!よりエレガントなものがあればアドバイスしてください。

+0

メニューの代わりにTActionを使用しようとしましたか? – dummzeuch

関連する問題