免费通知如何工作?

EPr*_*und 5 delphi user-interface vcl

目前,我正在尝试了解Delphi的VCL,特别是通知机制(在我看来这是一个很棒的机制)。

当我学习这个主题时,我想起了TLabeledEdit,当然我已经使用它很长时间了,但我从来没有机会停下来研究它的代码。

据我所知到目前为止:

当 TComponent 被销毁时:

  1. 它将通知其所有子组件,将其包含csDestroying在其状态中。
  2. FreeNotifiers部分。我无法理解。
  3. 将迭代components列表并且:
    1. components从列表中删除每个项目
    2. 实际上销毁每个组件实例。

当子组件被销毁时,它会为其所有子组件重新启动相同的进程。所以,据我所知,这是一个连锁效应。

我不明白的是FreeNotification,我能用它做什么?

让我们TLabeledEdit首先考虑一下。通知的相关部分,在TLabeledEdit的代码中是对函数的重写Notification,代码如下:

  if (AComponent = FEditLabel) and (Operation = opRemove) then
    FEditLabel := nil;
Run Code Online (Sandbox Code Playgroud)

FreeNotification如果不使用会发生什么?

一般来说,由于这种机制我会得到什么好处,以及我没有看到什么最终可能使它的存在变得必要?

Mas*_*ler 4

FreeNotification机制的作用是通知已注册的组件该组件正在被释放。 然后,他们使用他们的Notification方法来确保他们不持有任何对它的引用(这就是你的示例正在做的),这样他们就不会最终得到对无效对象的悬空引用。

  • @PageNotFound 当拥有的组件通知所有者时。这是通过调用“FreeNotification”启动的,并且可以改写:如果我负责的实例被销毁而不是由我启动,请通知我,这样我就可以从我的 ResponsibleFor 列表中踢掉这个实例。查看 `TComponent` 的源代码(从 `constructor Create( Owner : TComponent );` 开始) (3认同)