gpt4 book ai didi

德尔福。如何在不触发控件事件的情况下禁用/启用控件

转载 作者:行者123 更新时间:2023-12-03 18:03:19 25 4
gpt4 key购买 nike

我有一个数据集 (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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com