複数のCheckBoxの排他的選択法

解決


イルカ  2007-11-01 23:01:12  No: 28178

2007/07/27に同様の質問をし,いくつかの回答をいただきました.
最初の質問から4ヶ月以上経ってないのに,返信できず,新規にご質問させていただきます.
真に勝手ではございますが,皆様のご了承をお願いします.

あんこさん,大部遅くなりましたが,お礼申し上げます.
おかげさまで上記は解決いたしました.
私用で返事が遅くなりアドバイスをいただいた方々にご迷惑をおかけしました.

可能でありましたら,あんこさんの当時のソースの,
procedure TForm1.CheckBoxClickの中身について教えて頂ければと思います.
いくら頑張ってもなぜこれで排他的チェックが可能なのかよく分かりません.


他人だが・・・  2007-11-02 00:03:08  No: 28179

元記事はこれな
https://www.petitmonte.com/bbs/answers?question_id=4998

CheckBoxClickは、すべてのCheckBoxで、共通のイベント
すべてのCheckBoxが、チェックのオン/オフで、このイベント内に入ってくる
(ブレークポイント置いて確認したらわかる)

1) 全CheckBoxのイベントをなしにして、チェックのオン/オフしている
  以降のコードで、このイベントが発生しないようにしている。

CheckBox1.OnClick:=nil;
CheckBox2.OnClick:=nil;

2) Sender は、実行時にはチェックが変更されたCheckBoxである
  (Sender とはそういうものだ)
  従って、Sender 以外 のCheckBoxは、オフにしなくてはならない。
  それがここ
  if Sender<>CheckBox1 then CheckBox1.Checked:=False;
  if Sender<>CheckBox2 then CheckBox2.Checked:=False;

3) 1)ではずしたイベントを元に戻している
  CheckBox1.OnClick:=CheckBoxClick;
  CheckBox2.OnClick:=CheckBoxClick;
  〜


イルカ  2007-11-02 01:21:03  No: 28180

他人だが・・・さん,ご連絡ありがとうございます.勉強になりました.
よろしければ,以下の点についてご指導ください.

①最初のCheckBox1.OnClick := CheckBoxClickは,FormCreateの中にあり,1回のみ実行されると思いますが,あってますか?
もしそうなら,CheckBoxClick関数は1回のみ実行されることとなりませんか?

②CheckBox1.OnClick:=nilですが,イベントが発生しないようにしているとのことですが,このコマンドがなくても排他的選択は問題なく操作できます.なぜでしょうか?
#ただ,CheckBoxを2回クリックしないといけない.

③最後に,CheckBox1.OnClick := CheckBoxClickを実行すると,関数内で自分自身を実行することになりませんか?
要するに,CheckBoxClickを無限に実行することにはなりませんか?

初心者なのでつまらない質問かも知れません.ご了承願います.


TS  2007-11-02 03:38:14  No: 28181

>CheckBox1.OnClick := CheckBoxClick
はCheckBox1のOnClickイベントはCheckBoxClickにしましょうの意味
実行はされないし、一度指定すればいい。

>#ただ,CheckBoxを2回クリックしないといけない.
これはダブルクリックのイベントになります。


他人だが・・・  2007-11-02 17:42:10  No: 28182

とりあえずイベントとメソッドの違いを知ることから始めるべきかな
イベントは、何らかのアクションが発生した時に実行されるものである。
チェックボックスの場合、チェックボックスをクリック、または
スペースキー等によりOn/OFFを切り換えた場合、OnClickイベントが発生する
もちろん、コード上でCheckBox1.Checked := False のように、記述した場合
でON/OFFが変わっても、OnClickイベントが発生する。

>CheckBox1.OnClick := CheckBoxClick
これは、チェックのON/OFFが切り替わったときに、CheckBoxClickを
実行するようにしましょうと、定義しているだけで、CheckBoxClickを
実行しているわけではない。

以上をふまえて

(1) OK
(2)違う
例で説明

(A)CheckBox1がチェック状態でCheckBox2に変更する場合

CheckBoxClickが発生する(1回目)

このときCheckBoxClickの「Sender=CheckBox2」が成立する。
また、「(Sender<>CheckBox1) = True」になるので、
「CheckBox1.Checked:=False;」が処理される

このとき、OnClick = nil としておかないと、CheckBox1のOn/Offが
切り替わるため、Sender=CheckBox1としてCheckBoxClickが実行される。(2回目)

2回目のCheckBoxClickでは、(Sender<>CheckBox2)のため
「CheckBox2.Checked:=False;」が実行され、せっかくのチェックが
はずれてしまう。
ここで、CheckBox2がONからOFFに変わったため、再度「Sender=CheckBox2」
としてCheckBoxClickが実行される。(3回目)

3回目は、1回目同様「(Sender<>CheckBox1) = True」のため
「CheckBox1.Checked:=False;」が実行されるが、もともと
「CheckBox1.Checked = False」の状態なので、Sender=CheckBox1としての
CheckBoxClickは発生せず。

以降は、ON/OFFの変更が発生しないため、再度のCheckBoxClickが発生せず
すべてチェックがはずれた状態になる。

(B)次に、CheckBox1にチェックありCheckBox1をクリックした場合

Sender=CheckBox1として、CheckBoxClickが実行されるが、すべてチェックが
はずれた状態のため、一回限りのCheckBoxClickとなる。

(C)最後、すべてチェックなしでCheckBox1をクリックした場合

Sender=CheckBox1として、CheckBoxClickが実行されるが、
Sender<>CheckBox1 の場合に限り CheckBox1.Checked:=False; を実行するため
CheckBox1がONからOFFになることはない。またCheckBox2,CheckBox3は、OFFの
状態なので、CheckBox2.Checked:=False;, CheckBox3.Checked:=False; による
ON/OFF変化なく、CheckBoxClickが発生しないので、CheckBox1のみ
チェックされる。

> #ただ,CheckBoxを2回クリックしないといけない.
上記(A)と(C)が発生しているだけ。
CheckBoxClick で、ブレークポイントつけて、何回発生するか確認してみなさい。

(3)前述の通り


イルカ  2007-11-02 19:42:24  No: 28183

他人だが・・・さん
ご丁寧に説明いただきありがとうございます.
おかげさまで,ちゃんと理解できました.ありがとうございます!


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

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






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