当我改变CheckBox的状态时,我很想知道
CheckBox->Checked=false;
它调用CheckBoxOnClick事件,如何避免它?
答案 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