0

在我的 Delphi XE2 项目中,我有Form1,Label1CheckBox1.

我的要求是设置CheckBox1.Font.Color := clGreen;.

以为我写了

procedure TForm1.FormCreate(Sender: TObject);
begin
  CheckBox1.Font.Color := clGreen;
end;

然而这Font Color是默认的Black。所以我用其他方式定义它如下:

  1. 我已从 中删除Caption并将CheckBox1更改Width17
  2. 然后我把喜欢放在Label1旁边。CheckBox1CleckBox1 Caption
  3. 之后我写了:

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可以CheckBox1触发如下图: 表格1

4

2 回答 2

5

The Click() method merely triggers the contro's OnClick event, nothing else. It does not actually cause the control to perform click-related logic, like updating its internal state.

You can toggle the CheckBox's state like this:

CheckBox1.Checked := not CheckBox1.Checked;

Alternatively, use an accessor class to reach protected members:

type
  TCheckBoxAccess = class(TCheckBox)
  end;

TCheckBoxAccess(CheckBox1).Toggle;
于 2013-08-21T18:23:40.033 回答
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;
于 2013-08-22T14:59:11.567 回答