更改父容器会导致再次调用Createwnd,Delphi 6

时间:2013-04-18 20:11:32

标签: delphi parent custom-component owner

我们有一些覆盖createwnd的旧版delphi自定义组件。这些组件位于表单内的面板上。

当表单和面板被实例化时,组件也被实例化,并且createwnd被调用一次。这是有道理的。

我很惊讶地发现,如果我在运行时切换面板的父级,则会再次调用createwnd。

例如,在某些情况下,我可能会将Panel1的父容器更改为Form2.panel2。基本上在运行时在Form2的面板中绘制Panel1。

TForm1.buttonclick(..)
begin
..
  Panel1.parent := Form2.panel2;
..
end;

为什么在父级更改时会重新创建Panel1中的自定义组件?

Panel1中的所有组件的行为是相同的,即使是非自定义的组件,例如,如果我在Panel1上也有TButton,那么在父母切换时也会重新创建吗?我不这么认为,这就是为什么我这么惊讶。

最后,如果此行为不正确,我该如何制作,以便在父容器更改时不会调用createwnd。

谢谢!

1 个答案:

答案 0 :(得分:8)

面板中从TWinControl下降的所有控件都重新创建了窗口句柄,以及面板的窗口句柄(原因是相反)。

如果您的代码每个程序的生命周期只需要调用一次,那么CreateWnd就不是正确的地方。请尝试使用构造函数。

此外,将面板从一种形式替换为另一种形式可能会混淆面板的所有权,并可能导致意外行为甚至错误。请参阅:How to detach a panel and show it in a separate window?