こんにちは。
Delphi6 Personalを使っております。
現在FormにLabelとButtonを貼りつけてあります。
ButtonをクリックするとLabelに「1」と表示されるプログラムなのですが、エンターキーやスペースキーを押しても「1」と表示されてしまいます。
エンターキーはGoodなのですが、スペースキーはBadです。
スペースキーを押してもButtonを押せないようにできますか?
できましたらお教えください。
Formにフォーカス可能なコントロールが1つしかない場合には、そのコントロールにフォーカスがあり、フォーカスしていない状態にはできません。
TSpeedButtonなら、フォーカスを受けないので期待通りの動作ができると思います。
その場合、TActionでEnterキーをボタンに割り当てるようにしてください。
# 未確認です
にしのさん、ご回答下さりどうもありがとうございました。
TActionでEnterキーをボタンに割り当てるようにするというのがヘルプや書籍を読んでみてもわからなかったのですが、Buttonコンポーネントにおいてスペースキーのみを押せないようにすることはできないとわかっただけでよかったです。
まだまだDelphiをはじめたばかりでわからないことだらけですが、今後ともよろしくお願いします。
あ、解決済みの押し忘れです。
編集 削除「解決」済みなのにすいません。
Button1Click Procedureの最初に
以下の1行を入れるとスペースキーを無視できますがいかがでしょう?
ただし画面上ではボタンが押された表示になってしまいますが...
>if GetAsyncKeyState(VK_SPACE) = 1 then exit;
たびたびすいません。
「ゆう」さんは既におられますね。
「ごんべ」に改名します。
失礼しました...
ごんべさん、こんばんは。
レスをいただき嬉しいです。
えーと、以下のコードでやってみたのですがダメでした。
コードを実行し、スペースキーを押すと'1'と表示されてしまいます。
procedure TForm1.Button1Click(Sender: TObject);
begin
if GetAsyncKeyState(VK_SPACE) = 1 then
exit;
Label1.Caption := '1';
end;
#ダメかもじゃなんかなさけないのでハンドルネームかえました。
http://www.microsoft.com/JAPAN/developer/library/jpuipf/_win32_getasynckeystate.htm
こちらを参考にしてください。
"=1"ですと、前回のGetAsyncKeyState呼び出し以降に押された場合、ですので今回は<>0とすべきだと思います。
# 最上位ビットがたっているか調べるのがいいのでしょうが、0以外とすれば問題ないはず
一応、Actionプロパティのも試してみました。
Delphi5ですが動きました。
やりかたは、
1.Label,SpeedButtonを貼り付ける。
2.ActionListを貼り付ける。
3.ActionListに、1つのActionを追加、ShortCutプロパティを'Enter'にする
4.追加したAction(Action1)のOnExecuteイベントに、Labelを書き換える処理を書く
5.SpeedButtonのActionプロパティにAction1を設定
これで動きます。
ちょっと面倒ですけどね。
まさかとは思いますが、先に表示された[1]が残っていたという
ことはありませんよね。
以下で試してみてください。
ちなみに私の環境は WinXP(Pro.) + Delphi6(Personal) です。
procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption := '0';
if GetAsyncKeyState(VK_SPACE) = 1 then
exit;
Label1.Caption := '1';
end;
にしのさん、ありがとうございます。
親切に教えていただき感謝です。
Actionのほうは手こずりましたが無事思っていたことができました。
使い方がまったくわからなかったので具体的に手順を書いていただき
助かりました。
GetAsyncKeyState(VK_SPACE)のほうはできませんでしたが、
新しい技を覚えホクホクです。プログラミングって結構おもしろいです。
#レスが遅れがちですみません。
> まさかとは思いますが、先に表示された[1]が残っていたという
> ことはありませんよね。
> 以下で試してみてください。
ごんべさんへ
やはり、スペースキーを押して'1'と表示されます。
Delphiを再起動して新規にアプリケーションを作成し、下記のコードを書いてみたのですがダメでした。環境はWin2000、Delphi6 Personalです。
procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption := '0';
if GetAsyncKeyState(VK_SPACE) = 1 then
exit;
Label1.Caption := '1';
end;
戻り値の意味は確か、GetKeyStateとおんなじじゃないでしたっけ・・・?
うろ覚えなのであいまいですけど。
だったら、下のページが参考になるかも。
http://www.nifty.ne.jp/forum/fdelphi/faq/00259.htm
たかみちえさんへ
はじめまして(^0^)
ご紹介いただいたホームページを見てあれこれいろいろ頑張ってみたのですができませんでした。Buttonコンポーネントで実現するのは降参します。
にしのさんに教わった方法で当面はしのげると思います。speedコンポーネントを使ったことがないのであとで支障が出てくるかもしれませんが、そのときはそのときに考えようと思います。みなさん、どうもありがとうございました。
みなさん こんにちは。
できるカモさん、にしのさん、ごんべさん、たかみちえさん、はじめまして。
今さらですが、私もこれが気になって試してみました。(環境:Del5ENT + Win2000)
Delphiを再起動して新規にアプリケーションを作成、TButton1 と TLabel1 を貼り付け
procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption := '0';
if GetAsyncKeyState(VK_SPACE) = 1 then
exit;
Label1.Caption := '1';
end;
私の環境ではスペースキーを10数回連打すると、0と1がランダムに表示されます。
if GetAsyncKeyState(VK_SPACE) <>0 then や
if GetKeyState(VK_SPACE) <>0 then にしても、同じでした。
Label1.Caption := IntToStr(GetAsyncKeyState(VK_SPACE)); //こんなのや
Label1.Caption := IntToStr(GetKeyState(VK_SPACE)); //こんなのを
OnClick イベントや OnKeyDown イベント、 OnKeyPress イベントに書いてみたのですが、もうひとつはっきりしません。
全然回答になってなくて、すみません。(どなたか「連打」された方、いらっしゃいませんか?)