Firemonkey:获得父控制形式

Firemonkey: Getting parent form of control

我有一个自定义控件需要访问它所在的主窗体的高度。由于此控件嵌套在一系列面板中很常见,因此我编写了这段代码来尝试让我进入主窗体:

TControl * control = this;

while( control->HasParent() )
{
    control = control->ParentControl;
    ShowMessage( control->Name );
}

使用 ShowMessage 语句来跟踪我的进度,当我逐步执行代码时,我一直走到 "BasePanel",在这种情况下,它是 "BasePanel" 之前阶梯上的最后一个控件=20=] 但是,当对 ShowMessage 的调用发生在应该是 "MainForm" 的地方时,我遇到了访问冲突。

有什么原因导致我无法通过这种方式访问​​控件的主窗体吗?有没有更好的方法来访问控件的主窗体?

在读取 Name 之前,您没有检查 ParentControl return 是否为 NULL 指针。当 HasParent() return 为真时,ParentControl NOT 保证有效。例证 - TFormNOT FireMonkey 中的 TControl 后代,因此它不能被 ParentControl 编辑 return。

HasParent()的目的是报告组件是否有parent。 TFmxObject 覆盖 HasParent() 以报告 TFmxObject.Parent 属性 是否为 NULL,并覆盖 GetParentComponent() 到 return 一个适当的 TComponent parent。 TFmxObject.Parent returns a TFmxObject,因为 parent/child 关系在 FireMonkey 中不必像在 VCL 中那样是可视的,所以 ParentGetParentComponent()实际上 return 有时可能会有所不同 objects。

您应该使用 GetParentComponent() 而不是 ParentControl,正如 documentation 所说:

Call HasParent to determine whether a specific component has a parent.

Derived classes override this method to implement proper handling for parenting.

Use GetParentComponent to retrieve the component reference.

例如:

TComponent * comp = this;

while( comp->HasParent() )
{
    comp = comp->GetParentComponent();
    ShowMessage( comp->Name );
}

但是,如果您的目的是专门查找 parent TForm,请改用控件的 Root 属性:

TCommonCustomForm *form = dynamic_cast<TCommonCustomForm*>(this->Root->GetObject());