我们的应用程序中有许多表单,我需要一个全局事件处理程序来检测其中一个表单何时被销毁(然后采取一些操作)。
p.s:我想避免向每个表单添加代码,这些代码需要在主表单即将销毁时向主表单发送消息。大多数表单也是在运行时动态创建和销毁的。
我正在考虑也许使用全局 TApplicationEvents。
最好的方法是什么?
最佳答案
与David's answer相反,有一个合适的框架。它构建在 TComponent
类层次结构的较高位置。 Sir Rufo是在正确的轨道上,但您不需要强制您的表单归此对象所有。
欢迎您编写任意数量的类,这些类可以在表单(或与此相关的任何其他组件)被销毁时采取专门的操作。例如
TDestroyedFormLogger = class(TComponent)
protected
{ Write to log file when forms are destroyed. }
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
end;
TMenuManager = class(TComponent)
protected
{ Remove/hide a menu item corresponding to the form that has been destroyed. }
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
end;
现在,每当您创建表单时,只需按如下方式设置通知(假设您已授予自己对上述对象的合适实例的访问权限):
LForm := TMyForm.Create(Application);
LForm.FreeNotification(DestroyedFormLogger);
LForm.FreeNotification(MenuManager);
此方法比使用 OnDestroy
事件更好,因为它只允许 1 个观察者,而 FreeNotification
允许任意数量的观察者。
注意:与任何有用的技术一样,不要将问题强行适应该技术。可能有更适合您的具体问题的技术。例如。通过使用全局 Screen
对象来迭代表单 OnPopup
可以更好地解决 MenuManager
想法。
编辑:观察者模式的解释
TComponent
通知机制是 Observer Pattern 的内置实现。当一个组件被破坏时。 FreeNotification
(也许命名不理想)相当于 registerObserver
,RemoveNotification
相当于 unregisterObserver
。
观察者模式的要点在于,被观察的主体(有时称为发布者)对观察它的对象(有时称为发布者)没有类型特定的了解称为订阅者)。发布者只知道他们能够对每个注册订阅者(观察者)调用通用通知方法。这允许对象与观看它的对象松散耦合。 事实上,发布者根本不需要被观察。显然,注册方法需要从订阅者本身或第三方调用 - 否则解耦的目标就无法实现。
观察者可以以不同程度的复杂性来实现。最简单的是事件或回调。最复杂的是调度程序,它管理发布者和订阅者之间且独立于发布者和订阅者的注册。调度程序甚至可以实现线程切换,以便发布者甚至不会受到慢速订阅者性能副作用的影响。
TComponent
的观察者实现有一个限制,即发布者和订阅者都必须从 TComponent
继承。基本上任何组件都可以向另一个组件注册以获得其销毁的通知。
也许这个特性在 Delphi 中最常见的用途是:当组件 A 引用组件 B 时;如果组件 B 被销毁,组件 A 会收到通知,以便它可以将其引用设置为 nil。
关于delphi - 如何检测应用程序中的表单是否被破坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20445859/