【问题标题】:Is there a quick way to disable/enable all event handlers是否有快速禁用/启用所有事件处理程序的方法
【发布时间】:2015-10-24 12:05:01
【问题描述】:

通常在我的应用程序中,我有一个“加载”内存数据集(TClientDataSet 或 DevEx TdxMemData)的地方。在加载它之前,我会这样做:

CDS1.BeforeUpdate := nil;
CDS1.AfterUpdate := nil;
CDS1.AfterPost := nil;

... 等等。然后在加载之后(例如LoadData(CDS1))

CDS1.BeforeUpdate := CDS1BeforeUpdate;
CDS1.AfterUpdate := CDSAfterUpdate;
CDS1.AfterPost := CDS1AfterPost;

这很乏味,尤其是因为并非所有事件处理程序都在每个应用程序的每个上下文中都被分配,有时我会错过一个在运行时回来咬我的事件处理程序。

如果我可以打电话不是很好吗

CDS1.DisableallEventHandlers;
LoadData(CDS1);
CDS1.EnableallEventHandlers; // which were assigned at design-time, that is

【问题讨论】:

  • 您可以对事件处理程序中的布尔标志进行操作吗?喜欢if CDS1EventHandlersEnabled then ...。然后您需要做的就是将标志设置为 false,加载数据并重新启用标志...
  • 通常我有一个名为 isLoading 的标志,并且在所有事件处理程序中都显示为 if isloading then EXIT;
  • 当然,为什么不呢,这是一个可以接受的解决方案,你不觉得吗?
  • 我希望有更优雅的东西。
  • 基本上是一样的。如果您想要更优雅的解决方案,您可以将此功能封装在派生类中或使用基于 RTTI 的解决方案。

标签: delphi


【解决方案1】:

我建议使用 DisableallEventHandlersEnableallEventHandlers 方法创建一个类助手,而每个方法都使用 RTTI 来枚举事件处理程序属性并存储/检索指向/从映射的事件处理程序指针。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-06
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多