RadioGroupの初期値書き込みに関して

解決


べん  2010-07-27 17:49:46  No: 38863

RqadioGroupを使ったときに設定した値が反映されないことが起こります。

/////////Form1
unit Unit1;

procedure TForm1.Button1Click(Sender: TObject);
begin
Form2.Show;

end;

////////Form2
unit Unit2;

procedure TForm2.FormShow(Sender: TObject);
begin
   RadioGroup1.ItemIndex := 0;
   RadioGroup2.ItemIndex := 0;
   RadioGroup3.ItemIndex := 0;
end;

としてForm2をForm1から呼び出したときに、RadioGroupのOnShowでItemIndex
を全て0に設定します。
この設定をしていても、
先にForm2などでRadioGroup3.ItemIndex を1に変更し、Closeして再度開くと
FormShowでRadioGroup3.ItemIndex := 0;としているのに、1のままです。

もしForm2で全て1に設定して、一度閉じ、再度開いた場合は最後に1にしたRadioGroupの値が0になりません。
例)Form2を開く  →  RadioGroup1を1  →  RadioGroup3を1  →  RadioGroup2を1  →  Form2を閉じる   →  Form2を開く  
→  「RadioGroup2のみ1」となってしまう。
この現象は簡単に作成しても出てしまいます。

原因はOnShowの処理のあとに値を書き換えていると思いますが、
何か設定変更、対策などありますでしょうか?


tor  2010-07-27 18:30:46  No: 38864

Delphiのラジオボタンには「フォーカスが当たると自動的にチェックが付く」というやや困った性質があります。
普通にマウスやキーボードで操作する分にはフォーカスと選択状態が一致しますが
コードから選択状態を変更した場合にはフォーカスが一緒に移動しないため、このような問題が起こることがあります。

仮にRadioGroup1で先頭のラジオボタンを選択しているとしましょう。
RadioGroup1にフォーカスがある状態で、コードから ItemIndex := 1 と設定すると
チェックは2番目のラジオボタンに移りますが、フォーカスを表す点線は1番目のボタンに残ったままになると思います。
ここでいったん別のウィンドウに切り替えてから戻ってくると
1番目のラジオボタンにフォーカスが戻るため、そこでチェックも1番目に戻ってしまいます。

回避する方法としては2通り考えられます。
・コードからItemIndexを変更する際、ActiveControlも適宜変更してやる
・フォームがアクティブになった際、ActiveControl.TabStop=falseだったら
FindNextControlを発行して、TabStopのあるところまでフォーカスを動かす


べん  2010-07-27 20:28:02  No: 38865

torさん

とりあえずSetFocusを使用して強制的に違うところにFocusを移動させました。これで問題ないかと思います。

ありがとうございました


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

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






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