1

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

TControl * control = this;

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

使用该ShowMessage语句跟踪我的进度,当我逐步执行代码时,我一直到“BasePanel”,在这种情况下,它是“MainForm”之前的最后一个控制。但是,当调用ShowMessage应该是“MainForm”时,我会遇到访问冲突。

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

4

1 回答 1

1

在读取它之前,您没有检查是否ParentControl返回 NULL 指针Name。当HasParent()返回 true 时,ParentControl保证有效。举个例子 -TForm不是FireMonkeyTControl后代,所以它不能被ParentControl.

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

正如文档所述,您应该使用GetParentComponent()而不是:ParentControl

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

派生类覆盖此方法以实现正确的育儿处理。

使用GetParentComponent检索组件引用。

例如:

TComponent * comp = this;

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

但是,如果您的意图是TForm专门查找父级,请改用控件的Root属性:

TCommonCustomForm *form = dynamic_cast<TCommonCustomForm*>(this->Root->GetObject());
于 2015-09-23T05:49:22.113 回答