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の処理のあとに値を書き換えていると思いますが、
何か設定変更、対策などありますでしょうか?
Delphiのラジオボタンには「フォーカスが当たると自動的にチェックが付く」というやや困った性質があります。
普通にマウスやキーボードで操作する分にはフォーカスと選択状態が一致しますが
コードから選択状態を変更した場合にはフォーカスが一緒に移動しないため、このような問題が起こることがあります。
仮にRadioGroup1で先頭のラジオボタンを選択しているとしましょう。
RadioGroup1にフォーカスがある状態で、コードから ItemIndex := 1 と設定すると
チェックは2番目のラジオボタンに移りますが、フォーカスを表す点線は1番目のボタンに残ったままになると思います。
ここでいったん別のウィンドウに切り替えてから戻ってくると
1番目のラジオボタンにフォーカスが戻るため、そこでチェックも1番目に戻ってしまいます。
回避する方法としては2通り考えられます。
・コードからItemIndexを変更する際、ActiveControlも適宜変更してやる
・フォームがアクティブになった際、ActiveControl.TabStop=falseだったら
FindNextControlを発行して、TabStopのあるところまでフォーカスを動かす
torさん
とりあえずSetFocusを使用して強制的に違うところにFocusを移動させました。これで問題ないかと思います。
ありがとうございました
ツイート | ![]() |