如何动态地解除绑定所有事件处理程序,并在执行某些操作后重新绑定它们



我正在寻找一种通用的方法来解除所有事件处理程序的绑定,并在做一些可能触发它们的事情后再次重新绑定它们。

目前,我使用的具体解决方案如下:

var
  PrevBeforePost : TDataSetNotifyEvent;
  PrevAfterPost : TDataSetNotifyEvent;
begin
  PrevBeforePost := MyDataSet.BeforePost;
  MyDataSet.BeforePost := nil;
  PrevAfterPost := MyDataSet.AfterPost;
  MyDataSet.AfterPost := nil;
  try
    //do something that would have triggered event handlers
  finally
    MyDataSet.BeforePost := PrevBeforePost;
    MyDataSet.AfterPost := PrevAfterPost;
  end;
end;

这个解决方案意味着我必须在每次需要临时禁用事件处理程序时编写特定的代码,即使我正在做测试…此外,很容易陷入添加其他事件而不记得在代码中禁用它们的陷阱。

是否有一种方法来编写一个通用的解决方案,以相同的方式为所有组件工作?例子:

var
   Events : TInfosAboutEventHandlers;
begin
   Events := GetEventHandlersAndSetThemToNil(MyDataSet);
   try
     //do something that would have triggered event handlers
   finally
     SetEventHandlers(MyDataSet, Events);
   end;
end;

为什么不直接通过变量禁用它们呢?

在表单中定义"禁用"变量,并在每次想要避免事件时激活它。

type MyForm = class (TForm)
  ...
  private
     EventsDisabled: boolean;
  ...
end;
implementation
...
  EventsDisabled := True;
  try
    //do something that would have triggered event handlers
  finally
    EventsDisabled := False;
  end; 

现在你的事件只需要在做任何事情之前检查变量是否处于活动状态。

procedure TForm1.qryDataFieldNameOnChange(Sender: TObject);
begin
  if EventsDisabled then Exit;
  //actions to do when the event is triggered 
end;

相关内容

  • 没有找到相关文章

最新更新