我想知道当我更改 CheckBox 的状态时
CheckBox->Checked=false;
它调用 CheckBoxOnClick 事件,如何避免呢?
我想知道当我更改 CheckBox 的状态时
CheckBox->Checked=false;
它调用 CheckBoxOnClick 事件,如何避免呢?
在较新的 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 最初的想法。请注意有关班级助手的常见提示。
你可以用类似的东西包围 onClick 事件代码
if myFlag then
begin
...event code...
end;
如果您不希望它被执行,请将 myFlag 设置为 false,并在复选框状态更改后将其设置回 true。
另一种选择是使用如下插入器类更改受保护的 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;
我希望有一个按钮解决方案,但您可以将当前事件存储在 TNotifyEvent var 中,然后将 Checkbox.OnChecked 设置为 nil,然后恢复它。
试试这种方式:
Checkbox.OnClick := nil;
try
Checkbox.Checked := yourFlag;
finally
Checkbox.OnClick := CheckboxClick;
end;
其他一些更简单的解决方案不是避免 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;
使用focused 属性来确定控件是否已被单击或选中的控件是否已在控件外部更新。
如果 tcheckbox.focused 那么
run the content of the method
别的
skip the content
CheckBox.State := cbUnchecked;
在德尔福工作,这不会触发onClickEvent
AFAIK
简单的解决方案是将您的 onclick 代码放在 onmouseup 事件中;