我正在寻找一种解锁所有事件处理程序的常用方法,并在执行可能触发它们的操作后再次重新绑定它们。
目前,我正在使用以下特定解决方案:
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;
答案 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;