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

时间:2016-09-14 12:57:21

标签: delphi event-handling

我正在寻找一种解锁所有事件处理程序的常用方法,并在执行可能触发它们的操作后再次重新绑定它们。

目前,我正在使用以下特定解决方案:

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;

1 个答案:

答案 0 :(得分:3)

为什么不通过变量解除绑定而不是解除绑定?

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

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;