我有一个自定义控件,需要访问它所在的主窗体的高度。由于这个控件通常嵌套在一系列面板中,所以我编写了这段代码来尝试让我进入主窗体:
TControl * control = this;
while( control->HasParent() )
{
control = control->ParentControl;
ShowMessage( control->Name );
}
使用ShowMessage
语句跟踪我的进度,当我逐步完成代码时,我会一直到达#BaseSnel"在这种情况下,它是在" MainForm之前最后一次控制阶梯。"但是,当ShowMessage
的调用发生在" MainForm"我遇到了访问冲突。
是否有某种原因我无法以这种方式访问控件的主要形式?有没有更好的方法来访问控件的主窗体?
答案 0 :(得分:1)
在读取ParentControl
之前,您没有检查Name
是否返回NULL指针。当HasParent()
返回true时,ParentControl
NOT 保证有效。例如,TForm
NOT 是FireMonkey中的TControl
后代,因此ParentControl
无法返回它。
HasParent()
的目的是报告组件是否具有父级。 TFmxObject
会覆盖HasParent()
以报告TFmxObject.Parent
属性是否为NULL,并覆盖GetParentComponent()
以返回该父级的相应TComponent
。 TFmxObject.Parent
返回TFmxObject
,因为父/子关系不必像在VCL中那样在FireMonkey中是可视的,因此Parent
和GetParentComponent()
实际上可以返回不同的对象次。
您应该使用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());