我正在寻找一种通用的方法来解除所有事件处理程序的绑定,并在做一些可能触发它们的事情后再次重新绑定它们。
目前,我使用的具体解决方案如下:
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;