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 保证有效。例证 - TForm
是 NOT FireMonkey 中的 TControl
后代,因此它不能被 ParentControl
编辑 return。
HasParent()
的目的是报告组件是否有parent。 TFmxObject
覆盖 HasParent()
以报告 TFmxObject.Parent
属性 是否为 NULL,并覆盖 GetParentComponent()
到 return 一个适当的 TComponent
parent。 TFmxObject.Parent
returns a TFmxObject
,因为 parent/child 关系在 FireMonkey 中不必像在 VCL 中那样是可视的,所以 Parent
和 GetParentComponent()
实际上 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());
我有一个自定义控件需要访问它所在的主窗体的高度。由于此控件嵌套在一系列面板中很常见,因此我编写了这段代码来尝试让我进入主窗体:
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 保证有效。例证 - TForm
是 NOT FireMonkey 中的 TControl
后代,因此它不能被 ParentControl
编辑 return。
HasParent()
的目的是报告组件是否有parent。 TFmxObject
覆盖 HasParent()
以报告 TFmxObject.Parent
属性 是否为 NULL,并覆盖 GetParentComponent()
到 return 一个适当的 TComponent
parent。 TFmxObject.Parent
returns a TFmxObject
,因为 parent/child 关系在 FireMonkey 中不必像在 VCL 中那样是可视的,所以 Parent
和 GetParentComponent()
实际上 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());