在我的Delphi XE2项目中,我有Form1
,Label1
和CheckBox1
。
我的要求是设置CheckBox1.Font.Color := clGreen;
。
以为我写过
procedure TForm1.FormCreate(Sender: TObject);
begin
CheckBox1.Font.Color := clGreen;
end;
但Font Color
是默认Black
。所以我用其他方式定义了它如下:
Caption
移除了CheckBox1
,并将Width
更改为17
。Label1
放在CheckBox1
旁边,CleckBox1 Caption
。
procedure TForm1.Label1Click(Sender: TObject);
begin
CheckBox1.Click;
end;
到Toggle
状态CheckBox1
。
但我得到[DCC Error] Unit1.pas(37): E2362 Cannot access protected symbol TCustomCheckBox.Click
。
另一个问题是OnMouseDown Event
的{{1}}是否可以触发如下图:
答案 0 :(得分:5)
Click()
方法仅触发contro的OnClick
事件,而不是其他事件。它实际上并不会导致控件执行与点击相关的逻辑,例如更新其内部状态。
您可以像这样切换CheckBox的状态:
CheckBox1.Checked := not CheckBox1.Checked;
或者,使用访问者类来访问受保护的成员:
type
TCheckBoxAccess = class(TCheckBox)
end;
TCheckBoxAccess(CheckBox1).Toggle;
答案 1 :(得分:1)
您可以像以下一样使用它:
procedure TForm1.Label1Click(Sender: TObject);
begin
//either
CheckBox1.Checked := not CheckBox1.Checked; // this trigger onClick event!!
// or
// if you absolutely need it..
CheckBox1Click(Sender); // NOTE this will not check or uncheck CheckBox1
end;
但请注意,您在这里使用TLabel对象(发件人)。如果您不使用Sender
,则无需进一步关注即可。
但是最好将代码用于启用和禁用其他控件。只有一行,例如doenable()。
procedure TForm1.doEnable(enable: Boolean);
begin
Edit1.Enabled := enable;
Edit2.Enabled := enable;
Edit3.Enabled := NOT enable;
if enable then Label1.Font.Color := clGreen else Label1.Font.Color := clWindowText;
...
end;
procedure TForm1.Label1Click(Sender: TObject);
begin
// NOTE This trigger also CheckBox1 Click event.
CheckBox1.Checked := not CheckBox1.Checked;
// NOT needed.
//if CheckBox1.Checked then doEnable(true) else doEnable(false);
end;
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
if CheckBox1.Checked then doEnable(true) else doEnable(false);
end;