14

我想知道当我更改 CheckBox 的状态时

CheckBox->Checked=false;

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

4

9 回答 9

11

在较新的 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;

仅出于完整性考虑:FMXTCheckBox将表现相似(触发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 最初的想法。请注意有关班级助手的常见提示。

于 2014-01-28T10:15:13.147 回答
10

你可以用类似的东西包围 onClick 事件代码

if myFlag then
  begin
    ...event code...
  end;

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

于 2010-02-15T07:18:56.770 回答
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;
于 2010-02-15T07:57:32.873 回答
6

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

于 2010-02-15T07:02:46.037 回答
5

试试这种方式:

Checkbox.OnClick := nil;
try
  Checkbox.Checked := yourFlag;
finally
  Checkbox.OnClick := CheckboxClick;
end;
于 2016-03-28T10:50:08.600 回答
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;
于 2020-05-20T16:06:48.773 回答
1

使用focused 属性来确定控件是否已被单击或选中的控件是否已在控件外部更新。

如果 tcheckbox.focused 那么

 run the content of the method

别的

skip the content 
于 2021-01-27T22:16:05.057 回答
-1

CheckBox.State := cbUnchecked;在德尔福工作,这不会触发onClickEventAFAIK

于 2011-10-11T13:47:25.160 回答
-1

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

于 2017-05-18T06:19:39.093 回答