gpt4 book ai didi

delphi - 如何动态解除绑定(bind)所有事件处理程序并在做某事后重新绑定(bind)它们?

转载 作者:行者123 更新时间:2023-12-03 18:30:31 25 4
gpt4 key购买 nike

我正在寻找一种通用方法来解除所有事件处理程序的绑定(bind),并在执行会触发它们的操作后再次重新绑定(bind)它们。

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

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;

最佳答案

为什么不取消绑定(bind)它们而不是通过变量禁用它们?

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

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;

关于delphi - 如何动态解除绑定(bind)所有事件处理程序并在做某事后重新绑定(bind)它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39491040/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com