ホーム >プログラム >Delphi 6 ローテクTips

コンポーネントメモ・TCheckBox

TCheckBoxの問題点。


Actionプロパティ

ActionプロパティにTActionをセットするとCheckedの値がTActionの値に基づかない場合があります。

症状:

という場合で

  1. プログラム起動後Form2を生成する前にAction1.CheckedをTrueにセット。
  2. その後Form2を動的生成。

とすると、生成されたForm2のCheckBox1.CheckedはTrueではなくFalseになってしまいます。
またForm1のAction1.Checkedの値もFalseになってしまいます。

本来ならForm2の生成時に現在のForm1のAction1の値を基にForm2のCheckBox1の値を変えなければならないものを(RadioButtonやToolButtonなどではそうなります)Form2のCheckBox1の値を基にForm1のAction1の値を変えてしまっています。

対策:
その1.
Form1のAction1の値のセットを行う前、例えばForm1のOnCreateでForm2をCreateしてしまいます。
事前にCreateしてあればこの問題は起きません。

procedure TForm1.FormCreate(Sender: TObject);
begin

  Form2 := TFrom2.Create(Application);

  Action1.Checked := True;
end;

この例ではAction1.Checkedの値をセットするときにはForm2のCheckBox1は既に生成されているのでAction1の値が適用されるので問題はおきません。

その2.
CheckBox1のActionプロパティは設計時にはセットせず、Form2のOnCreateでセットします。
そのときにはCheckBox1のActionプロパティにForm1.Action1をセットする前にAction1の値をCheckBox1にセットしないといけません。

procedure TForm2.FormCreate(Sender: TObject);
begin

  CheckBox1.Checked := Form1.Action1.Checked; //必須。また↓の前でなければならない
  CheckBox1.Action  := Form1.Action1;

end;

CheckBox1のActionプロパティにAction1をセットする前にCheckedの値をセットすることが肝です。
これをしないと設計時のCheckBoxのCheckedの値のままになります。

CheckBox1のActionプロパティにAction1をセットする前にCheckedの値をセットしなかった場合の例。

procedure TForm2.FormCreate(Sender: TObject);
var
 lb_Befor, lb_After: Boolean;
begin

  Form1.Action1.Checked := True;

  lb_Befor := Form1.Action1.Checked;
  CheckBox1.Action := Form1.Action1;
  lb_After := Form1.Action1.Checked;

end;

このコードの結果は、
設計時のCheckBox1のCheckedの値がFalseならば、lb_BeforはTrueになりますがlb_AfterはFalseになります。
設計時のCheckBox1のCheckedの値がTrueならば、lb_Beforもlb_AfterもTrueになります.。
ただしその場合Form1.Action1.Checked := False;とした場合、lb_BeforはFalseになりますがlb_AfterはTrueになります。

どうやらTCheckBoxの場合はActionプロパティをセットするとき、Checkedの値はTActionの値ではなくTCheckBoxのCheckedの値を基にしてしまうようです。


2010-02-08: