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

ert*_*rtx 2 delphi controls dataset

我有一个DataSet(TZQuery),它有几个布尔字段,分配了TDBCheckBoxes.

这些CheckBoxes OnClick分配了" "事件,只要我更改字段值(分配给复选框),就会触发它们.

问题是我在数据集的许多操作中都不需要触发这些事件.

我试过打电话DataSet.DisableControls,但是我打电话后就打电话给我DataSet.EnableControls.

所以我的问题是 - 有没有办法禁用触发数据感知控件事件.

编辑(大图):

如果在我们说保存数据时发生异常,我必须加载默认值(或者在保存之前我已经拥有的值).现在在加载这些数据时,所有这些事件(TDBCheckBoxes和其他数据感知控件)都会被触发,这些操作会产生延迟,有时甚至会产生不必要的数据更改,我正在寻找一种通用的解决方案来禁用它们在短时间内.

Rob*_*ank 6

在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"的通用测试 - 但我不知道它是什么.

希望有人会建设性地批评我的答案(而不仅仅是投票.)但是,希望我上面展示的内容是可行的.


Gui*_*ens 5

一种方法是:

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