【问题标题】:Firemonkey: Getting parent form of controlFiremonkey:获取父级控制形式
【发布时间】:2015-09-21 14:54:43
【问题描述】:

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

TControl * control = this;

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

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

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

【问题讨论】:

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


    【解决方案1】:

    在读取 Name 之前,您没有检查 ParentControl 是否返回 NULL 指针。当HasParent() 返回真时,ParentControl 保证有效。恰当的例子 - 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());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-31
      • 2015-05-09
      • 2012-01-18
      相关资源
      最近更新 更多