【问题标题】:Changing Parent Container causes Createwnd to be called again, Delphi 6更改父容器会导致再次调用 Createwnd,Delphi 6
【发布时间】:2013-04-12 02:42:21
【问题描述】:

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

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

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

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

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

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

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

最后,如果这种行为不正确,我该如何做到这一点,以便在父容器更改时不会调用 createwnd。

谢谢!

【问题讨论】:

  • 行为不正确。这是设计的。
  • 其实叫TControl.RecreateWnd。有的话看看VCL源码;它的行为与设计完全一致。

标签: delphi parent custom-component owner


【解决方案1】:

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

如果您的代码在每个程序的生命周期中只能调用一次,那么CreateWnd 不是正确的位置。请改用构造函数。

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

【讨论】:

  • 感谢您的回答和洞察力。我将把代码移到构造函数中。
  • 看起来只是改变formstyle,例如,从fsMdichild 到fsNormal 也会触发组件的createwnds。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-12
  • 1970-01-01
  • 2021-02-17
  • 2012-11-14
  • 1970-01-01
相关资源
最近更新 更多