与之相反大卫的回答 https://stackoverflow.com/a/20446480/224704,有一个合适的框架。它构建在类层次结构的较高位置TComponent
. Sir Rufo https://stackoverflow.com/a/20448429/224704是在正确的轨道上,但您不需要强制您的表单归此对象所有。
欢迎您编写任意数量的类,这些类可以在表单(或与此相关的任何其他组件)被销毁时采取专门的操作。例如。
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
允许任意数量的观察员。
NOTE:与任何有用的技术一样,不要将问题强加到该技术上。可能有更适合您的具体问题的技术。例如。这MenuManager
使用全局可以更好地解决这个想法Screen
对象迭代形式OnPopup
.
编辑:观察者模式的解释
The TComponent
通知机制是一个内置的实现观察者模式 http://en.wikipedia.org/wiki/Observer_pattern当一个组件被破坏时。FreeNotification
(也许命名不理想)相当于registerObserver
and RemoveNotification
相当于unregisterObserver
.
观察者模式的要点是被观察的主体(有时称为发布者)没有特定类型了解正在观察它的对象(有时称为订阅者)。发布者只知道他们能够对每个注册订阅者(观察者)调用通用通知方法。这允许对象与观看它的对象松散耦合。事实上,发布者根本不需要被观察。显然,注册方法需要从订阅者本身或第三方调用——否则解耦的目标就会落空。
观察者可以以不同程度的复杂性来实现。最简单的是事件或回调。最复杂的是调度程序,它管理发布者和订阅者之间且独立于发布者和订阅者的注册。调度程序甚至可以实现线程切换,以便发布者甚至不会受到慢订阅者性能副作用的影响。
TComponent
的观察者实现有一个限制,发布者和订阅者都必须继承TComponent
。基本上任何组件都可以向另一个组件注册以收到其销毁的通知。
也许 Delphi 中此功能最常见的用途是:当组件 A 引用组件 B 时;如果组件 B 被销毁,组件 A 就会收到通知,以便它可以将其引用设置为 nil。