Buttonの押されたことを検知したいのですが、OnClickイベントで検知してフラグをON,OFFしても上手くいきません。ボタン押下げを知るプロパティのようなものはあるのでしょうか?
OnKeyDownでとれませんか?
procedure TfrmExMain.btnOKKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
Press := True;
end;
として、
Press := False;
repeat
Label1.Caption := 'OK ボタンを押してください';
until Press = True;
としても、ボタンが消えてしまいます(ラベルとともに白抜きになります。)
OnMouseDownで、TButtonのマウスクリック押下
OnMouseUpで、TButtonのマウスクリック押上が取れます。
OnMouseDownにしても,repeat文だからOKボタンを押すまでこの行で止まらなければいけないのに、次の行に進んでしまいます。
実は、ListBoxにデータ複数表示し、そのうちのいくつかを選んでもらい、OKボタンを押した時、そのデータを得たいのです。ですから、OnMouseDownでは
最初のListBoxのクリックで動作してしまうので具合が悪いのです。
なお、OnMouseDownではボタン等の白抜きはなくなりました。
procedure TForm1.Button1Click(Sender: TObject);
begin
Caption := ListBox1.Items[ListBox1.ItemIndex];
end;
単純にこんな風にやると何か不都合がありますか?
ボタンが押された,というのであればOnClickで十分な
ように思えたのですが。
すみません、説明不足でした。
ListBoxのデータ(項目)は、選択されないこともあるのです。一個または
複数個選択される場合もあります。だから、OKボタンで選択完了を知る必要があります。それで、前述のリストのようにrepeat文でボタンの押し下げを待っているのですが、上手くいかないのです。
repeat文で上手くいかないのが何故なのか解らないのです。
まだ良く分かっていません。
①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ボタンを押した時、そのデータを得たい」とい
う要件を満たすのではないのかと思ったのですが。
もしこのような方法で解決できないということであれば,もう少し具体的
な要件を書かれた方が,回答者も回答しやすいと思います。
>repeat文で上手くいかないのが何故なのか解らないのです。
これではうまくいくはずがありません。
上のrepeat文のループの中にはメッセージ処理がないので、
「ボタンの押しさげを待つ」ということができません。
根本的に、プログラムの実行がどのように行われるかを知らないのだ、と思います。
イベントドリブンのプログラミングでは、質問2さんのようにするのが正解です。
ウィンドウズのようなOSで、プログラムがどうやって動作しているか、の基本を
理解する必要がありますね。
> Press := False;
> repeat
> Label1.Caption := 'OK ボタンを押してください';
> until Press = True;
ほかでPressが変更されても、これでは検知できないですね。
Loopの中にApplication.Processmessageを入れてみてください。
えーとさんとHOタさんの仰るとおり、repeat文のなかで釦押し下げが検地できないですね。
HOタさんのお教えのとおりで上手くいきました。
ありがとうございました。
ツイート | ![]() |