Firemonkey:获得父控制形式

时间:2015-09-21 14:54:44

标签: c++ forms firemonkey c++builder-xe8

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

TControl * control = this;

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

使用ShowMessage语句跟踪我的进度,当我逐步完成代码时,我会一直到达#BaseSnel"在这种情况下,它是在" MainForm之前最后一次控制阶梯。"但是,当ShowMessage的调用发生在" MainForm"我遇到了访问冲突。

是否有某种原因我无法以这种方式访问​​控件的主要形式?有没有更好的方法来访问控件的主窗体?

1 个答案:

答案 0 :(得分:1)

在读取ParentControl之前,您没有检查Name是否返回NULL指针。当HasParent()返回true时,ParentControl NOT 保证有效。例如,TForm NOT 是FireMonkey中的TControl后代,因此ParentControl无法返回它。

HasParent()的目的是报告组件是否具有父级。 TFmxObject会覆盖HasParent()以报告TFmxObject.Parent属性是否为NULL,并覆盖GetParentComponent()以返回该父级的相应TComponentTFmxObject.Parent返回TFmxObject,因为父/子关系不必像在VCL中那样在FireMonkey中是可视的,因此ParentGetParentComponent()实际上可以返回不同的对象次。

您应该使用GetParentComponent()而不是ParentControl,因为documentation说:

  

调用HasParent以确定特定组件是否具有父组件。

     

派生类重写此方法以实现对父级的正确处理。

     

使用GetParentComponent检索组件参考。

例如:

TComponent * comp = this;

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

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

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