我们有一些遗留的delphi自定义组件,它们会覆盖createwnd。这些组件位于表单中的面板上。

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

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

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

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


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

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

最后,如果此行为不正确,我该如何做,以使父容器发生更改时不会调用createwnd。

谢谢!

最佳答案

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

如果每个程序的生命周期只需要调用一次代码,则CreateWnd不合适。请尝试使用构造函数。

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

09-05 09:53