Button押下げ検知

解決


kisan  2007-08-31 22:31:03  No: 27588

Buttonの押されたことを検知したいのですが、OnClickイベントで検知してフラグをON,OFFしても上手くいきません。ボタン押下げを知るプロパティのようなものはあるのでしょうか?


HOta  2007-08-31 23:57:36  No: 27589

OnKeyDownでとれませんか?


kisan  2007-09-01 01:03:24  No: 27590

procedure TfrmExMain.btnOKKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  Press := True;
end;

として、

  Press := False;
  repeat
    Label1.Caption := 'OK ボタンを押してください';
  until  Press = True;

としても、ボタンが消えてしまいます(ラベルとともに白抜きになります。)


通りすがり  2007-09-01 02:09:28  No: 27591

OnMouseDownで、TButtonのマウスクリック押下
OnMouseUpで、TButtonのマウスクリック押上が取れます。


kisan  2007-09-01 02:40:24  No: 27592

OnMouseDownにしても,repeat文だからOKボタンを押すまでこの行で止まらなければいけないのに、次の行に進んでしまいます。
実は、ListBoxにデータ複数表示し、そのうちのいくつかを選んでもらい、OKボタンを押した時、そのデータを得たいのです。ですから、OnMouseDownでは
最初のListBoxのクリックで動作してしまうので具合が悪いのです。
なお、OnMouseDownではボタン等の白抜きはなくなりました。


質問です  2007-09-01 04:12:25  No: 27593

procedure TForm1.Button1Click(Sender: TObject);
begin
  Caption := ListBox1.Items[ListBox1.ItemIndex];
end;

単純にこんな風にやると何か不都合がありますか?
ボタンが押された,というのであればOnClickで十分な
ように思えたのですが。


kisan  2007-09-01 07:56:51  No: 27594

すみません、説明不足でした。
ListBoxのデータ(項目)は、選択されないこともあるのです。一個または
複数個選択される場合もあります。だから、OKボタンで選択完了を知る必要があります。それで、前述のリストのようにrepeat文でボタンの押し下げを待っているのですが、上手くいかないのです。
repeat文で上手くいかないのが何故なのか解らないのです。


質問2  2007-09-01 09:42:51  No: 27595

まだ良く分かっていません。

①Label1を配置。
②Label1のCaptionを「ボタンを押してください。」にしておく。
③Button1のOnClickイベントに,以下のようなコードを書いてみる。

  var 
    i: Integer;

  Label1.Caption := 'OKが押されました。';
  if ListBox1.Items.Count > 0 then begin
    for i := 0 to ListBox1.Items.Count - 1 do begin
      if ListBox1.Selected[i] then
        ShowMessage(IntToStr(i + 1) + '番目の項目は選択されています。')
      else
        ShowMessage(IntToStr(i + 1) + '番目の項目は選択されていません。')
    end;
  end;

  こんなコードを書くと,「ListBoxにデータ複数表示し、そのうちの
いくつかを選んでもらい、OKボタンを押した時、そのデータを得たい」とい
う要件を満たすのではないのかと思ったのですが。
  もしこのような方法で解決できないということであれば,もう少し具体的
な要件を書かれた方が,回答者も回答しやすいと思います。


えーと  2007-09-01 10:56:57  No: 27596

>repeat文で上手くいかないのが何故なのか解らないのです。

これではうまくいくはずがありません。
上のrepeat文のループの中にはメッセージ処理がないので、
「ボタンの押しさげを待つ」ということができません。

根本的に、プログラムの実行がどのように行われるかを知らないのだ、と思います。
イベントドリブンのプログラミングでは、質問2さんのようにするのが正解です。

ウィンドウズのようなOSで、プログラムがどうやって動作しているか、の基本を
理解する必要がありますね。


HOタ  2007-09-01 19:11:52  No: 27597

>  Press := False;
>  repeat
>    Label1.Caption := 'OK ボタンを押してください';
>  until  Press = True;

ほかでPressが変更されても、これでは検知できないですね。
Loopの中にApplication.Processmessageを入れてみてください。


kisan  2007-09-01 22:05:41  No: 27598

えーとさんとHOタさんの仰るとおり、repeat文のなかで釦押し下げが検地できないですね。
HOタさんのお教えのとおりで上手くいきました。
ありがとうございました。


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

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






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