如何使用Delphi中的“Label Click”事件触发Checkbox的“Click”事件?

时间:2013-08-21 18:16:05

标签: delphi

在我的Delphi XE2项目中,我有Form1Label1CheckBox1

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

以为我写过

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

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

  1. 我已从Caption移除了CheckBox1,并将Width更改为17
  2. 然后我将Label1放在CheckBox1旁边,CleckBox1 Caption
  3. 之后我写了:
  4. 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}}是否可以触发如下图: Form1

2 个答案:

答案 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;