5

数年前に開発したコードでは、これを頻繁に使用して、Escapeキーを押したときに現在のフォームを閉じています。

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

この動作はTFormに対して定義されています。フォームのKeyPreviewプロパティはTrue、他のコンポーネントの前にフォームがキーの押下に反応するように設定されています。プログラムの最良の部分ではすべて完全に機能しますが、TEditコンポーネントがフォーカスされているときにEscキーを押すと、サウンド(Windowsが無効な操作を示すために使用する音)が鳴りますそれでも問題なく動作しますが、私は音を完全に取り除くことができませんでした。

これの何が問題なのですか?


再作成する手順:

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

    key =#27の場合;

  • TListBox、TCheckBox、TEditをフォームに追加し、アプリケーションを実行します

  • アプリケーションでEscキーを押してみてください。ダミーコードで指定されているように、何も起こりません。
  • TEditにフォーカスを合わせ、Escキーを押します。何も起こりませんが、音が鳴ります。
4

4 に答える 4

23

入力にESCを残したので、音が出ます。Key がvarであることがわかりますか? #0 に設定すると、音はなくなります。これにより、以降の処理から削除されます。

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

KeyPreview はまさにそれであり、停止しない限りコントロールに渡されるもののプレビューです。

于 2009-04-20T21:49:12.487 に答える