ert*_*rtx 2 delphi controls dataset
我有一个DataSet(TZQuery),它有几个布尔字段,分配了TDBCheckBoxes.
这些CheckBoxes 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;
Run Code Online (Sandbox Code Playgroud)
恢复以前的价值观
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;
Run Code Online (Sandbox Code Playgroud)
可能有一种方法可以将所有if语句折叠成一个回答"此组件是否具有OnClickEvent"的通用测试 - 但我不知道它是什么.
希望有人会建设性地批评我的答案(而不仅仅是投票.)但是,希望我上面展示的内容是可行的.
一种方法是:
var
Event : TNotifyEvent;
begin
Event := myCheckbox.OnClick;
try
myCheckbox.OnClick := nil;
//your code here
finally
myCheckbox.OnClick := Event;
end;
end;
Run Code Online (Sandbox Code Playgroud)
HTH
| 归档时间: |
|
| 查看次数: |
11040 次 |
| 最近记录: |