- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个数据集 (TZQuery
),它有几个 bool 字段,分配有 TDBCheckBoxes。
这些复选框分配有“OnClick
”事件,只要我更改字段值(分配给复选框),它们就会被触发。
问题是我不需要触发这些事件,在我对数据集执行的许多操作中。
我试过调用 DataSet.DisableControls
,但是在我调用 DataSet.EnableControls
之后立即调用了事件。
所以我的问题是 - 有没有办法禁止触发数据感知控件事件。
编辑(大图):
如果在保存数据时发生异常,我必须加载默认值(或保存前的值)。现在在加载该数据时,所有这些事件(TDBCheckBoxes 和其他数据感知控件)都会被触发,这些事件会执行各种操作,这些操作会造成延迟,有时甚至是不需要的数据更改,我正在寻找一种通用的解决方案来禁用它们在很短的时间内。
最佳答案
基于 Guillem 的帖子:
关闭一切:
使用 for 循环遍历表单上的每个组件,如下所示,将属性更改为所需的值。
如果您想稍后恢复为原始属性值,则必须保存原始值(因为下面使用了 OldEvent。)
编辑:下面的代码显示了正在讨论的关键概念。如果在运行时添加或删除组件,或者如果您想使用绝对最少的内存量,则使用动态数组,并且如 Pieter 所建议的那样,存储指向组件的指针而不是对它们进行索引。
const
MAX_COMPONENTS_ON_PAGE = 100; // arbitrarily larger than what you'd expect. (Use a dynamic array if this worries you.
var
OldEvent: Array[0.. MAX_COMPONENTS_ON_PAGE - 1] of TNotifyEvent; // save original values here
i: Integer;
begin
for i := 0 to ComponentCount - 1 do
begin
if (Components[i] is TCheckBox) then
begin
OldEvent[i] := TCheckBox(Components[i]).OnClick; // remember old state
TCheckBox(Components[i]).OnClick := nil;
end
else if (Components[i] is TEdit) then
begin
OldEvent[i] := TEdit(Components[i]).OnClick; // remember old state
TEdit(Components[i]).OnClick := nil;
end;
end;
恢复到以前的值
for i := 0 to ComponentCount - 1 do
begin
if (Components[i] is TCheckBox) then
TCheckBox(Components[i]).OnClick := OldEvent[i]
else if (Components[i] is TEdit) then
TEdit(Components[i]).OnClick := OldEvent[i];
end;
可能有一种方法可以将所有 if 语句折叠成一个通用测试来回答“此组件是否有 OnClickEvent”——但我不知道它是什么。
希望有人会建设性地批评我的回答(而不是仅仅否决它。)但是,希望我上面展示的内容是可行的。
关于德尔福。如何在不触发控件事件的情况下禁用/启用控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11096448/
我是一名优秀的程序员,十分优秀!