我想知道当我改变 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;
仅为完整性说明: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提供的原始想法。请注意有关类助手的常规提示。
另一种选项是使用一个类似这样的中介类来更改受保护的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;
你可以将onClick事件代码用类似这样的方式包围起来:
if myFlag then
begin
...event code...
end;
如果您不想执行它,请将myFlag设置为false,并在复选框状态更改后将其设置回true。
我希望有一个按钮的解决方案,但你可以将当前事件存储在TNotifyEvent变量中,然后将Checkbox.OnChecked设置为nil,最后恢复它。
Checkbox.OnClick := nil;
try
Checkbox.Checked := yourFlag;
finally
Checkbox.OnClick := CheckboxClick;
end;
使用 focused 属性来确定控件是否已被单击或已在控件外部更新了 checked 属性。
如果 tcheckbox.focused,则
run the content of the method
skip the content
还有一种更简单的解决方案,不是避免OnClick事件,而是修改事件处理程序,除非DataSet.State处于由用户触发的TDBCheckBox点击引起的dsEdit或dsInsert状态,否则不做出响应,例如:
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;
CheckBox.State := cbUnchecked;
在 Delphi 中有效,据我所知,这不会触发 onClickEvent