OnKeyDownとOnKeyPressのキー処理の違い
76 KeyPressKeyDown 動作確認 Delphi2007 更新日 2008/02/04(月)

TEditやTMemoなどでは、OnKeyDownとOnKeyPressのイベントがあります。
TMemoを使って、それぞれの違いを調べておきましょう。

◆  KeyDown
キーは仮想キーコードで取得することができるので
キーを検知したり、押されたキーを文字として取得したい場合、
次のようにします。
────────────────────
procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  //Aキーが押されたかどうかがわかる。
  if (Key = Ord('A')) then
  begin

  end else

  //スペースが押されたかどうかわかる。
  if (Key = VK_SPACE) then
  begin

  end;
  Self.Caption := Chr(Key); //キーから文字を取り出す
end;
────────────────────
Ord('A')=$41 で、
Shiftが押されているか否かは、Keyだけでは区別がつかない。

Keyは参照引数になっているが、代入してもキー入力が変化する事はないので
Aキーを押した時に、Bという文字を入力する事にはできない。

キーから文字を取り出すためにはChr(Key)とする。
Shiftの区別がないので、[a]でも[A]でも画面には[A]が表示される。



◆  KeyPress
キーはCharで取得することができ、
キーを検知したり、押されたキーを文字として取得したい場合、
さらにキーを置き換えたように見せる場合、
次のようにします。
────────────────────
procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
  //Aが入力されたかどうかがわかる。
  if (Key = 'A') then
  begin
    Key := 'B';     //Bが押された事にする
  end else

  //aが入力されたかどうかがわかる。
  if (Key = 'a') then
  begin
    Key := 'c';     //cが押された事にする
  end else

  //スペースが押されたかどうかわかる。
  if (Key = Chr(VK_SPACE)) then
  begin
    Key := #0;      //キーが押されてないようにする
  end;
  Self.Caption := Key;      //キーから文字を取り出す
end;
────────────────────
Shiftが押されているかどうかは、Keyの内容で判断できる。

Keyに値を代入することで入力内容を変更することができるので
aを入力された時に、bという文字を入力する事ができる。



上記のような違いがあります。

双方とも連続して押し続けた時のイベント発生動作は変わりません。
はじめの一回、イベントが発生して
しばらく待った後に、イベントが連続して発生します。

キーを変更できるKeyPressの方が応用が効きます。

例えば
TEditでEnterキーを押した場合、
ビープ音がでますがこれをでないように防止するには、
KeyPressイベントでKeyを#0に置き換えるとよいです。