行き詰っていますので、ご質問させてください…
今、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 のボタンだけ、
押しても認識されません。
仮にボタンをクリックをして、カーソルをセットした後は、動作します。
またこのボタンが押せるようになると、他のボタンが押せなくなってしまいます。何か解決策はございますでしょうか?
困られている現象を完全には再現/理解はできないのですが、実現したいことが下記のようなことではないかと推測して見ました。
●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;
追加情報
procedure TForm1.ButtonClick(Sender: TObject)はすべてのTButtonのOnClickイベントに共通で指定しています。
ちょっと誤解してい部分がありました。
>>BUtton0-10にOnkeydownを共有し、以下のコードを書いています。
>>----
>>procedure TForm1.KeyDown
TButton自体のOnKeyDownイベントで処理していたのですね。
ただ、これだと、やはりTButtonにフォーカスがある前提なので、リターンキーを押した時の動作が希望通りとならないと思います。
>procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
> Shift: TShiftState);
この処理はTForm1のOnKeyDownイベントに指定してあります。
おもさん、お返事遅れました。
まず、ボタンのイベントにOnkeypressを使っていたことが
間違いだと思いました‥。
ご指摘の通り、フォーム1のイベントにOnkeypressを設定しました。
かつキーが押される度に、またマウスでボタンをクリックする度に
フォーカスをTabSheet1にすることで、
問題は解決しました。助かりました。本当にありがとうございます。
ツイート | ![]() |