更改CheckBox状态而不调用OnClick事件

时间:2010-02-15 06:34:53

标签: delphi c++builder tcheckbox

当我改变CheckBox的状态时,我很想知道

CheckBox->Checked=false;

它调用CheckBoxOnClick事件,如何避免它?

9 个答案:

答案 0 :(得分:10)

另一种选择是使用这样的插入器类来更改受保护的ClicksDisable属性:

type
  THackCheckBox = class(TCustomCheckBox)
  end;

procedure TCheckBox_SetCheckedNoOnClick(_Chk: TCustomCheckBox; _Checked: boolean);
var
  Chk: THackCheckBox;
begin
  Chk := THackCheckBox(_Chk);
  Chk.ClicksDisabled := true;
  try
    Chk.Checked := _Checked;
  finally
    Chk.ClicksDisabled := false;
  end;
end;

答案 1 :(得分:9)

您可以使用类似

的内容包围onClick事件代码
if myFlag then
  begin
    ...event code...
  end;

如果您不希望它被执行,请将myFlag设置为false,并在复选框状态更改后将其设置为true。

答案 2 :(得分:9)

在较新的Delphi版本中,您可以使用类助手来添加此功能:

CheckBox.SetCheckedWithoutClick(False);

为VCL TCheckBox使用以下类助手:

TCheckBoxHelper = class helper for TCheckBox
    procedure SetCheckedWithoutClick(AChecked: Boolean);
end;

procedure TCheckBoxHelper.SetCheckedWithoutClick(AChecked: Boolean);
begin
    ClicksDisabled := True;
    try
        Checked := AChecked;
    finally
        ClicksDisabled := False;
    end;
end;

为了完整性:FMX TCheckBox的行为类似(触发OnChange)。您可以使用以下类助手解决此问题:

TCheckBoxHelper = class helper for TCheckBox
    procedure SetCheckedWithoutClick(AChecked: Boolean);
end;

procedure TCheckBoxHelper.SetCheckedWithoutClick(AChecked: Boolean);
var
    BckEvent: TNotifyEvent;
begin
    BckEvent := OnChange;
    OnChange := nil;
    try
        IsChecked := AChecked;
    finally
        OnChange := BckEvent;
    end;
end;

免责声明:谢谢,dummzeuch最初的想法。请注意关于课堂助手的常用提示。

答案 3 :(得分:6)

我希望有一个按钮解决方案,但您可以将当前事件存储在TNotifyEvent var中,然后将Checkbox.OnChecked设置为nil,然后将其恢复。

答案 4 :(得分:3)

尝试这种方式:

Checkbox.OnClick := nil;
try
  Checkbox.Checked := yourFlag;
finally
  Checkbox.OnClick := CheckboxClick;
end;

答案 5 :(得分:1)

其他一些更容易解决的方法不是避免OnClick事件,而是修改事件处理程序以使其不响应,除非DataSet.State位于dsEdit或dsInsert中(由用户触发的TDBCheckBox启动),例如:

procedure TForm1.chkSelectClick(Sender: TObject);
begin
  if chkSelect.Checked = True then
    if DataSource1.DataSet.State in [dsEdit,dsInsert] then
      begin
        { your event handler }
      end;
end;

答案 6 :(得分:1)

使用focused属性来确定控件是否已被点击或checked是否已在控件外更新。

如果 tcheckbox.focused 那么

 run the content of the method

其他

skip the content 

答案 7 :(得分:0)

简单的解决方案是将您的onclick代码放在onmouseup事件中;

答案 8 :(得分:-1)

CheckBox.State := cbUnchecked;适用于Delphi,但不会触发onClickEvent AFAIK