Onkeydownで数字と仮想キーの入力をするには

解決


さゆさゆ  2010-05-23 09:36:11  No: 38521

行き詰っていますので、ご質問させてください…
今、TForm1→PageControl1→Button0〜10、Eとあります。
BUtton0-10にOnkeydownを共有し、以下のコードを書いています。
----
procedure TForm1.KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin

     If Chr(key) = '0' then
     begin
          Button0Click(Sender);
     end
----
条件文は異なるだけで同じ文が0〜9まであるわけなんですが、
条件式が If key = VK_RETURN  のボタンだけ、
押しても認識されません。
仮にボタンをクリックをして、カーソルをセットした後は、動作します。
またこのボタンが押せるようになると、他のボタンが押せなくなってしまいます。何か解決策はございますでしょうか?


おも  2010-05-23 20:24:22  No: 38522

困られている現象を完全には再現/理解はできないのですが、実現したいことが下記のようなことではないかと推測して見ました。

●Form1→PageControl1→TabSheet1→Button0〜9,Eがある (TabSheet1を挿入し、Button10は削除)
●キーボードより、数字'0'〜'9'を押した場合に対応するButton0〜9のOnClickイベントが発生
●キーボードより、リターンキーを押した場合にはButtonEのOnClickイベントが発生

ここで厄介なのは、TButtonにフォーカスがある場合には、リターンキーを押すとTForm1.KeyDownは処理されずにフォーカスがあるTButtonのOnClickイベントが発生することです。
よって、TButtonのOnClickイベントで、フォーカスをTabSheet1へ移動させました。
また、タブによるフォーカス移動もしないように全てのTButtonのTabStopプロパティをFalseにします。

Delphi6 Personal,Win2000の環境で希望通りの処理とはなっています。
なお、TForm1.KeyDownというprocedure名ではなく、TForm1.FormKeyDownを使っています。

// *** サンプルコード *** //

procedure TForm1.ButtonClick(Sender: TObject);
begin
    ShowMessage(TButton(Sender).Caption+'が押されました');

    //実際のマウスクリックでフォーカスがボタンに移動していた場合に
    //リターンキーでボタンのOnClickイベントが発生するのを回避するために
    //PageControl1のTabSheet1にフォーカスを移す
    if TButton(Sender).Focused then TabSheet1.SetFocus;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  sNo:String;
  btn:TButton;
begin
    if Key=VK_RETURN then begin
        ButtonE.Click;
    end else begin
        //キーボードからの'1'〜'9'までの数字入力に対応
        //テンキーからの数字入力には別途対応が必要

        sNo:=Chr(key);
        try
           if StrToInt(sNo)<10 then begin
                btn:=FindComponent('Button'+sNo) as TButton;
                btn.Click;
           end;
        except
        end;
    end;
end;


おも  2010-05-23 20:32:49  No: 38523

追加情報

procedure TForm1.ButtonClick(Sender: TObject)はすべてのTButtonのOnClickイベントに共通で指定しています。


おも  2010-05-23 20:44:11  No: 38524

ちょっと誤解してい部分がありました。

>>BUtton0-10にOnkeydownを共有し、以下のコードを書いています。
>>----
>>procedure TForm1.KeyDown

TButton自体のOnKeyDownイベントで処理していたのですね。
ただ、これだと、やはりTButtonにフォーカスがある前提なので、リターンキーを押した時の動作が希望通りとならないと思います。

>procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
>  Shift: TShiftState);

この処理はTForm1のOnKeyDownイベントに指定してあります。


さゆさゆ  2010-05-25 09:57:43  No: 38525

おもさん、お返事遅れました。

まず、ボタンのイベントにOnkeypressを使っていたことが
間違いだと思いました‥。
ご指摘の通り、フォーム1のイベントにOnkeypressを設定しました。
かつキーが押される度に、またマウスでボタンをクリックする度に
フォーカスをTabSheet1にすることで、
問題は解決しました。助かりました。本当にありがとうございます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加