FreeNotification如何运作?

时间:2014-04-23 18:53:43

标签: delphi user-interface vcl

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

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

据我所知,到目前为止:

销毁TComponent时:

  1. 它会通知其所有子组件,并在其状态中包含csDestroying
  2. FreeNotifiers部分。我无法理解。
  3. 将迭代components列表并:
    1. components列表
    2. 中删除每个项目
    3. 实际上销毁每个组件实例。
  4. 当子组件被销毁时,它会为其所有子组件重新启动相同的进程。所以,据我所知,这是一种连锁效应。

    我无法理解的是FreeNotification,我可以用它做些什么?

    让我们首先考虑TLabeledEditTLabeledEdit代码中通知的相关部分是Notification函数的覆盖,代码如下:

      if (AComponent = FEditLabel) and (Operation = opRemove) then
        FEditLabel := nil;
    

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

    总的来说,由于这种机制,我有什么好处,而我没看到的最终可能会使其存在?

2 个答案:

答案 0 :(得分:4)

FreeNotification机制的作用是通知已注册的组件正在释放此组件。然后,他们使用Notification方法确保它们不包含任何引用它(这是你的例子正在做的事情),以便它们不会以对无效对象的悬空引用结束。

答案 1 :(得分:0)

FreeNotification的目的是允许您在这些组件关闭并释放自己的情况下清理对子组件的引用。在此示例中,我使用Modal表单,FreeNotification将引用设置为NULL,这允许我检测表单是否仍然打开或者如果用户创建另一个表单已经存在

void __fastcall TForm1::OpenForm(TObject *Sender)
{
    frmGetPrint = new TfrmGetPrint(Application);
    frmGetPrint->FreeNotification( this);
    frmGetPrint->Show();
}

frmGetPrint在关闭时必须自行释放:

void __fastcall TfrmSetPrint::FormClose(TObject *Sender, TCloseAction &Action)
{
    Action = caFree;
}

你需要在FreeNotification(this)调用中以 this 引用的父窗体创建一个函数,在本例中为Form1

void __fastcall TForm1::Notification(Classes::TComponent* AComponent, 
Classes::TOperation Operation)
{
    if( AComponent == frmGetPrint && Operation == opRemove)
        frmGetPrint = NULL;
}