|
15番会議室「FAQ編纂委員会」に寄せられた「よくある質問の答え」
[Q]
フォームへ仮想キーを送ることでつまずいています。OnKeyDown のヘルプ
に次のような例が挙げられています。
-------------------(ヘルプより抜粋、改行位置変えました。)
例
次のイベントハンドラはユーザーが Alt+F10 を押したときにメッセージダ
イアログを表示します。
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if ((Shift = [ssAlt]) and (Key = VK_F10)) then
MessageDlg('Alt+F10 pressed down', mtInformation, [mbOK], 0);
end;
-------------------
ところが、フォームにボタンや、リストボックス、パネルなどを配置して
いると、これが実行できません(ビープ音が鳴って何も起こらない)。
試しに、全く空のフォームで、つまり、フォームの新規作成で、空白フォ
ームを選んだあと、全くコントロールを配置しないと、そのフォームでは実
行できました。これでは役に立ちません。どうすればいいのでしょう?
[A]
フォームの KeyPreview プロパティーを true にして下さい。すると、ヘ
ルプにあるように、
-------------------(ヘルプより抜粋、改行位置変えました。)
KeyPreview プロパティが True ならば,フォームのどのコントロールが選
択されているかに関係なくほとんどのキーイベント (OnKeyDown イベント,
OnKeyUp イベント,OnKeyPress イベント) は最初にフォームに渡されます。
アプリケーションはキーイベントをどう処理するか指定できます。キーイベ
ントはフォームに渡された後,フォームで選択したコントロールに渡されま
す。KeyPreview が False ならば,キーイベントは直接コントロールに渡さ
れます。デフォルト値は False です。
-------------------
というわけです。
ところが、
-------------------(ヘルプより抜粋、改行位置変えました。)
選択したコントロールが Tab, BackTab, 矢印キーなどの移動キーを処理する
場合は例外です。これらの移動キーを捕捉するためには,KeyPreview を True
にする必要があります。
-------------------
とあるんですが、これだけでは不十分です。
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage := AppMessage;
end;
procedure TForm1.AppMessage(var Msg: TMsg; var Handled: Boolean);
begin
if Msg.message = WM_KEYDOWN then begin
case Msg.wParam of
VK_RETURN: ShowMessage('AppMessage: VK_RETURN'); {*1}
VK_RIGHT: ShowMessage('AppMessage: VK_RIGHT') {*2-1}
VK_TAB: ShowMessage('AppMessage: VK_TAB'); {*2-2}
VK_BACK: ShowMessage('AppMessage: VK_BACK'); {*2-3}
end;
end;
end;
というような、イベントハンドラが必要です。{*1} は悪い例です。
ShowMessage はリターンキーに応答する OK ボタンをもつため、この場合、
リターンキーだけ押していては終わることができません。ESC やボタンク
リックが必要です。ただ、リターンキーも捕捉できるという例で挙げました。
{*2} の各キーによる動作は、例えば、フォームにボタンを複数配置して実
行してみると、上のヘルプの説明を追試することができます。右矢印キーを
押すと、まずここの {*2-1} が実行され、メッセージボックスが現れます。
ボタンクリックあるいは ESC でこれを閉じると、フォーカスのあったボタン
にVK_RIGHT キーが送られ、フォーカスは次のコントロール(この場合は次の
ボタン)に移ります。VK_TAB、VK_BACK も同様です。
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum FDELPHIに寄せられる質問の中から、よくある質問への回答を FDELPHIのメンバーがまとめたものです。 したがって、これらの回答はボーランド株式会社がサポートする公式のものではなく、掲示されている内容についての問い合わせは受けられない場合があります。
Copyright 1996-1998 Delphi Users' ForumFAQ編纂委員会
|