Button押下げ検知

解決


kisan  2007-08-31 13:31:03  No: 27588  IP: 192.*.*.*

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

編集 削除
HOta  2007-08-31 14:57:36  No: 27589  IP: 192.*.*.*

OnKeyDownでとれませんか?

編集 削除
kisan  2007-08-31 16:03:24  No: 27590  IP: 192.*.*.*

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

として、

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

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

編集 削除
通りすがり  2007-08-31 17:09:28  No: 27591  IP: 192.*.*.*

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

編集 削除
kisan  2007-08-31 17:40:24  No: 27592  IP: 192.*.*.*

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

編集 削除
質問です  2007-08-31 19:12:25  No: 27593  IP: 192.*.*.*

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

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

編集 削除
kisan  2007-08-31 22:56:51  No: 27594  IP: 192.*.*.*

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

編集 削除
質問2  2007-09-01 00:42:51  No: 27595  IP: 192.*.*.*

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

①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 01:56:57  No: 27596  IP: 192.*.*.*

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

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

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

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

編集 削除
HOタ  2007-09-01 10:11:52  No: 27597  IP: 192.*.*.*

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

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

編集 削除
kisan  2007-09-01 13:05:41  No: 27598  IP: 192.*.*.*

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

編集 削除