delphi – 控件的Owner和Parent之间有什么区别?
我对Delphi VCL控件的两个属性有点好奇.
每个组件在运行时都有2个属性作为Owner和Parent.任何人都可以帮我理解两者之间的区别吗?它们如何被windows用于显示控件或表单? 解决方法
所有者
创建表单时,流式处理框架会解析.dfm文件并实例化其中列出的组件.通常使用指定为表单的所有者创建这些组件. 在组件生命的另一端是破坏.当一个组件被销毁时,它也会破坏它拥有的所有组件.为了一个具体的例子,考虑一个位于TForm上的TButton,在设计时放置在那里.流式框架创建按钮,将其所有者设置为表单.作为TComponent的后代,该表单维护着它拥有的所有组件的列表.当表单被销毁时,它会遍历所拥有的组件列表并销毁它们.按钮以这种方式被破坏. 这有很多细微差别: >组件不需要由表单拥有.例如,在运行时创建的组件由传递给构造函数的任何组件拥有. 因为流式框架实例化组件,所以TComponent的构造函数被声明为virtual: constructor Create(AOwner: TComponent); virtual; 如果从TComponent后代派生,并且希望将派生组件放置在设计图面上,则必须遵守此虚拟构造函数.如果在TComponent后代中定义构造函数,则它必须覆盖此虚构造函数. 值得指出的是,Win32有一个完全不同的窗口所有者概念,不应该与同名的VCL概念混淆. Windows documentation说:
在VCL术语中,PopupParent属性公开了此概念.该属性是在Delphi 7之后引入的,因此无法使用.在Delphi 7中,框架设置了窗口所有者,并没有提供简单的机制来覆盖框架的选择.如果确实需要影响窗口所有权,则必须覆盖CreateParams并设置Params.WndParent.遗憾的是,在VCL处理Delphi 7中的所有权时存在许多问题,有时需要在这些有点血腥的细节中进行处理. 为了表明混淆是多么容易,VCL documentation说:
这是完全错误的.对于顶级窗口,这是所有者而不是父级. 亲
从本质上讲,VCL Parent属性直接映射到Win32父级概念. 但请注意,Parent是在TControl中定义的.现在,TControl没有窗口化,因此在Win32意义上TControl不是子控件,因为Win32窗口的子窗口本身就是窗口.因此,具有已定义父级的TControl是VCL意义上的子级,称为非窗口子控件.这些非窗口控件将自身绘制为其父级绘制处理程序的一部分.这种控制的典型例子是TLabel. 请注意,当窗口控件(即TWinControl后代)被销毁时,它也会销毁其所有子节点. TWinControl后代可以使用ControlCount和Controls []属性枚举其子项.这些列举了窗口和非窗口的子项. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |