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

cnd*_*cnd 13 delphi c++builder tcheckbox

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

CheckBox->Checked=false;
Run Code Online (Sandbox Code Playgroud)

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

dum*_*uch 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;
Run Code Online (Sandbox Code Playgroud)


Hol*_*rwa 9

您可以使用类似的方式包围onClick事件代码

if myFlag then
  begin
    ...event code...
  end;
Run Code Online (Sandbox Code Playgroud)

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


yon*_*joy 9

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

CheckBox.SetCheckedWithoutClick(False);
Run Code Online (Sandbox Code Playgroud)

通过为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;
Run Code Online (Sandbox Code Playgroud)

只是为了完整性: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;
Run Code Online (Sandbox Code Playgroud)

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


Rem*_*mko 6

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