Buttonコンポーネントについて

解決


だめカモ  2002-12-28 23:42:07  No: 2461

こんにちは。
Delphi6  Personalを使っております。
現在FormにLabelとButtonを貼りつけてあります。

ButtonをクリックするとLabelに「1」と表示されるプログラムなのですが、エンターキーやスペースキーを押しても「1」と表示されてしまいます。

エンターキーはGoodなのですが、スペースキーはBadです。
スペースキーを押してもButtonを押せないようにできますか?
できましたらお教えください。


にしの  2002-12-29 06:54:41  No: 2462

Formにフォーカス可能なコントロールが1つしかない場合には、そのコントロールにフォーカスがあり、フォーカスしていない状態にはできません。
TSpeedButtonなら、フォーカスを受けないので期待通りの動作ができると思います。

その場合、TActionでEnterキーをボタンに割り当てるようにしてください。
# 未確認です


だめカモ  2002-12-29 22:56:45  No: 2463

にしのさん、ご回答下さりどうもありがとうございました。

TActionでEnterキーをボタンに割り当てるようにするというのがヘルプや書籍を読んでみてもわからなかったのですが、Buttonコンポーネントにおいてスペースキーのみを押せないようにすることはできないとわかっただけでよかったです。

まだまだDelphiをはじめたばかりでわからないことだらけですが、今後ともよろしくお願いします。


だめカモ  2002-12-29 22:59:25  No: 2464

あ、解決済みの押し忘れです。


ゆう  2002-12-31 07:39:59  No: 2465

「解決」済みなのにすいません。

Button1Click Procedureの最初に
以下の1行を入れるとスペースキーを無視できますがいかがでしょう?
ただし画面上ではボタンが押された表示になってしまいますが...

>if GetAsyncKeyState(VK_SPACE) = 1 then exit;


ごんべ  2002-12-31 07:46:56  No: 2466

たびたびすいません。
「ゆう」さんは既におられますね。
「ごんべ」に改名します。

失礼しました...


できるカモ  2002-12-31 09:04:04  No: 2467

ごんべさん、こんばんは。
レスをいただき嬉しいです。

えーと、以下のコードでやってみたのですがダメでした。
コードを実行し、スペースキーを押すと'1'と表示されてしまいます。

procedure TForm1.Button1Click(Sender: TObject);
begin
    if GetAsyncKeyState(VK_SPACE) = 1 then
        exit;
    Label1.Caption := '1';
end;

#ダメかもじゃなんかなさけないのでハンドルネームかえました。


にしの  2002-12-31 09:15:33  No: 2468

http://www.microsoft.com/JAPAN/developer/library/jpuipf/_win32_getasynckeystate.htm
こちらを参考にしてください。
"=1"ですと、前回のGetAsyncKeyState呼び出し以降に押された場合、ですので今回は<>0とすべきだと思います。
# 最上位ビットがたっているか調べるのがいいのでしょうが、0以外とすれば問題ないはず


にしの  2002-12-31 09:31:50  No: 2469

一応、Actionプロパティのも試してみました。
Delphi5ですが動きました。

やりかたは、
1.Label,SpeedButtonを貼り付ける。
2.ActionListを貼り付ける。
3.ActionListに、1つのActionを追加、ShortCutプロパティを'Enter'にする
4.追加したAction(Action1)のOnExecuteイベントに、Labelを書き換える処理を書く
5.SpeedButtonのActionプロパティにAction1を設定

これで動きます。
ちょっと面倒ですけどね。


ごんべ  2002-12-31 09:54:19  No: 2470

まさかとは思いますが、先に表示された[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;


できるカモ  2002-12-31 10:16:49  No: 2471

にしのさん、ありがとうございます。
親切に教えていただき感謝です。

Actionのほうは手こずりましたが無事思っていたことができました。
使い方がまったくわからなかったので具体的に手順を書いていただき
助かりました。

GetAsyncKeyState(VK_SPACE)のほうはできませんでしたが、
新しい技を覚えホクホクです。プログラミングって結構おもしろいです。

#レスが遅れがちですみません。


できるカモ  2002-12-31 10:29:37  No: 2472

> まさかとは思いますが、先に表示された[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;


たかみちえ  URL  2002-12-31 10:43:17  No: 2473

戻り値の意味は確か、GetKeyStateとおんなじじゃないでしたっけ・・・?
うろ覚えなのであいまいですけど。

  だったら、下のページが参考になるかも。
http://www.nifty.ne.jp/forum/fdelphi/faq/00259.htm


できるカモ  2003-01-01 03:15:34  No: 2474

たかみちえさんへ

はじめまして(^0^)
ご紹介いただいたホームページを見てあれこれいろいろ頑張ってみたのですができませんでした。Buttonコンポーネントで実現するのは降参します。
にしのさんに教わった方法で当面はしのげると思います。speedコンポーネントを使ったことがないのであとで支障が出てくるかもしれませんが、そのときはそのときに考えようと思います。みなさん、どうもありがとうございました。


ビビビのびぐる  2003-01-31 02:59:47  No: 2475

みなさん  こんにちは。
できるカモさん、にしのさん、ごんべさん、たかみちえさん、はじめまして。

今さらですが、私もこれが気になって試してみました。(環境: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  イベントに書いてみたのですが、もうひとつはっきりしません。

全然回答になってなくて、すみません。(どなたか「連打」された方、いらっしゃいませんか?)


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








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