delphi - 如何检测应用程序中的表单是否被破坏?

标签 delphi delphi-7

我们的应用程序中有许多表单,我需要一个全局事件处理程序来检测其中一个表单何时被销毁(然后采取一些操作)。

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(也许命名不理想)相当于 registerObserverRemoveNotification 相当于 unregisterObserver

观察者模式的要点在于,被观察的主体(有时称为发布者)对观察它的对象(有时称为发布者)没有类型特定的了解称为订阅者)。发布者只知道他们能够对每个注册订阅者(观察者)调用通用通知方法。这允许对象与观看它的对象松散耦合。 事实上,发布者根本不需要被观察。显然,注册方法需要从订阅者本身或第三方调用 - 否则解耦的目标就无法实现。

观察者可以以不同程度的复杂性来实现。最简单的是事件或回调。最复杂的是调度程序,它管理发布者和订阅者之间且独立于发布者和订阅者的注册。调度程序甚至可以实现线程切换,以便发布者甚至不会受到慢速订阅者性能副作用的影响。

TComponent 的观察者实现有一个限制,即发布者和订阅者都必须从 TComponent 继承。基本上任何组件都可以向另一个组件注册以获得其销毁的通知。

也许这个特性在 Delphi 中最常见的用途是:当组件 A 引用组件 B 时;如果组件 B 被销毁,组件 A 会收到通知,以便它可以将其引用设置为 nil。

关于delphi - 如何检测应用程序中的表单是否被破坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20445859/

相关文章:

delphi - 在另一种形式上调用过程?

delphi - 如何使用 DSPack 渲染 MemoryStream 中的视频?

delphi - DeferWindowPos 是否与 VCL 配合良好?

windows - Delphi 7 写进程内存

c# - 如何在c#中调用delphi dll的事件?

delphi - 从 Delphi7 迁移到 Delphi XE 或 2010 for Unicode?

delphi - 在 Delphi 中使用 XSLT 2.0 需要什么

delphi - 在其他 PNG 上绘制 PNG 图像

Delphi - 将 NtCreateKey 与 HKCU 结合使用

delphi - JclMapi映射一般失败