gpt4 book ai didi

delphi - 控件的所有者和父级有什么区别?

转载 作者:行者123 更新时间:2023-12-03 14:40:56 25 4
gpt4 key购买 nike

我对 Delphi VCL 控件的两个属性有点好奇。

每个组件有 2 个属性,如 OwnerParent在运行时。谁能帮我理解两者之间的区别?窗口如何使用它们来显示控件或表单?

最佳答案

所有者

Owner TComponent 中引入的属性, 和 Owner本身有类型 TComponent . Owner主要用于管理设计组件的生命周期。也就是说,您放置在表单设计器(或实际上是其他设计图面)上并且其生命周期完全由框架管理的组件。 documentation说:

Indicates the component that is responsible for streaming and freeing this component.



创建表单时,流框架解析 .dfm 文件并实例化其中列出的组件。这些组件通常使用 Owner 创建指定为表格。

组件生命的另一端是破坏。当一个组件被销毁时,它也会销毁它拥有的所有组件。为了一个具体的例子,考虑一个 TButton坐在 TForm 上,在设计时放置在那里。流框架创建按钮设置其 Owner成为形式。形式,作为 TComponent 的后代维护它拥有的所有组件的列表。当表单被销毁时,它会遍历拥有的组件列表并销毁它们。按钮以这种方式销毁。

这有很多细微差别:
  • 组件不需要由表单拥有。例如,在运行时创建的组件归您传递给构造函数的任何组件所有。
  • 组件不需要拥有者,您可以通过 nil到构造函数。在这种情况下,程序员仍然负责销毁组件。
  • 在组件的生命周期内可以更改所有权。

  • 因为流框架实例化了组件, TComponent的构造函数被声明为虚拟:
    constructor Create(AOwner: TComponent); virtual;

    如果您源自 TComponent后代,并且您希望将派生组件放置在设计图面上,那么您必须尊重这个虚拟构造函数。如果你在 TComponent 中定义了一个构造函数后代那么它必须覆盖这个虚拟构造函数。

    值得指出的是,Win32 有一个完全不同的窗口所有者概念,不应与 VCL 的同名概念混淆。 Windows documentation说:

    Owned Windows

    An overlapped or pop-up window can be owned by another overlapped or pop-up window. Being owned places several constraints on a window. - An owned window is always above its owner in the z-order. - The system automatically destroys an owned window when its owner is destroyed. - An owned window is hidden when its owner is minimized.

    Only an overlapped or pop-up window can be an owner window; a child window cannot be an owner window.



    在 VCL 术语中,这个概念由 PopupParent 公开。属性(property)。该属性是在 Delphi 7 之后引入的,因此您将无法使用。在 Delphi 7 中,框架设置了窗口所有者,并没有提供简单的机制来覆盖框架的选择。如果您确实需要影响窗口所有权,那么您必须覆盖 CreateParams并设置 Params.WndParent .不幸的是,在 Delphi 7 中 VCL 处理所有权存在许多问题,有时需要仔细研究这些有点血腥的细节。

    为了说明混淆是多么容易,VCL documentation说:

    WndParent: The window handle of the parent window. This is the same as the Handle property of the parent control.



    这简直是​​错误的。对于顶级窗口,这是所有者而不是父窗口。

    家长

    Parent 是在 TControl 中定义的属性并具有类型 TWinControl .该属性广泛用于公开父控件和子控件的 Win32 概念。 Windows documentation说:

    A window can have a parent window. A window that has a parent is called a child window. The parent window provides the coordinate system used for positioning a child window. Having a parent window affects aspects of a window's appearance; for example, a child window is clipped so that no part of the child window can appear outside the borders of its parent window. A window that has no parent, or whose parent is the desktop window, is called a top-level window.



    本质上,VCL Parent属性直接映射到 Win32 父概念上。

    但是请注意, ParentTControl 中定义.现在, TControl没有窗口,所以 TControl不是 Win32 意义上的子控件,因为 Win32 窗口的子控件本身就是窗口。所以,一个 TControl带有定义的 Parent是 VCL 意义上的子控件,称为非窗口子控件。这些非窗口控件将自己绘制为它们父级绘制处理程序的一部分。这种控件的典型示例是 TLabel .

    注意当一个窗口控件时,就是一个 TWinControl后代,被摧毁,它也摧毁了它的所有 child 。

    一个 TWinControl后代可以使用 ControlCount 枚举其子代和 Controls[]特性。这些枚举窗口和非窗口的 child 。

    关于delphi - 控件的所有者和父级有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32241645/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com