更改复选框状态而不调用 OnClick 事件
我想知道当我更改 CheckBox 的状态时
CheckBox->Checked=false;
它会调用 CheckBoxOnClick Event ,如何避免它?
I'm wondering so when I change state of CheckBox
CheckBox->Checked=false;
It calls CheckBoxOnClick Event , how to avoid it ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(10)
有时
需要更改 TCheckBox 组件的状态,但无需操作 OnClick 事件。这个任务可以这样解决:
{设置一个已检查}
{设置一个未检查}
foudn this on scalabium.com
Sometimes it's necessary to change a state of TCheckBox component, but without operation of OnClick event. This task can be solved so:
{set a checked}
{set a unchecked}
CheckBox.State := cbUnchecked;
在 Delphi 中工作,这不会触发onClickEvent
AFAIKCheckBox.State := cbUnchecked;
works in Delphi, this doesn't fireonClickEvent
AFAIK在较新的 Delphi 版本中,您可以使用类帮助器来添加此功能:
通过对 VCL
TCheckBox
使用以下类帮助器:只是为了完整性:FMX
TCheckBox
的行为类似(触发OnChange
)。您可以使用以下类帮助器来解决此问题:免责声明:谢谢 dummzeuch 的原始想法。请注意有关类助手的常见提示。
In newer Delphi versions you can use class helpers to add this functionality:
by using the following class helper for a VCL
TCheckBox
:Just for completeness: A FMX
TCheckBox
will behave similar (triggeringOnChange
). You can workaround this by using the following class helper:Disclaimer: Thanks, dummzeuch for the original idea. Be aware of the usual hints regarding class helpers.
您可以用类似的内容包围 onClick 事件代码,
如果您不想执行它,请将 myFlag 设置为 false,并在复选框状态更改后将其设置回 true。
You could surround the onClick event code with something like
If you don't want it to be executed, set myFlag to false and after the checkbox state's change set it back to true.
另一种选择是使用插入器类更改受保护的 ClicksDisable 属性,如下所示:
Another option is to change the protected ClicksDisable property using an interposer class like this:
我希望有一个按钮解决方案,但您可以将当前事件存储在 TNotifyEvent var 中,然后将 Checkbox.OnChecked 设置为 nil,然后恢复它。
I hope there's a button solution but you could store the current event in a TNotifyEvent var, then set Checkbox.OnChecked to nil and afterwards restore it.
尝试这样:
try this way:
使用 focus 属性来确定控件是否已被单击或选中的内容是否已在控件外部更新。
如果 tcheckbox.focused 那么
else
Use the focused property to establish if the control has been clicked or the checked has been updated outside the control.
If tcheckbox.focused then
else
其他一些更简单的解决方案不是避免 OnClick 事件,而是修改事件处理程序,使其不响应,除非 DataSet.State 位于 dsEdit 或 dsInsert 中,由用户触发的 TDBCheckBox 单击启动,例如:
Some other and much easier solution is not avoiding the the OnClick event but modifying the event handler not to respond unless the DataSet.State is in either dsEdit or dsInsert as initiated by a user triggered TDBCheckBox click e.g.:
简单的解决方案是将 onclick 代码放在 onmouseup 事件中;
Simple solution is to put your onclick code in onmouseup event;