为什么控件不会在 Android FireMonkey 应用程序中跨越多列或多行?

Why won't controls span multiple columns or rows in an Android FireMonkey app?

我有一个带有 GridPanelLayout 的 FireMonkey 应用程序,与客户端对齐。它有 6 列和 16 行。控件包括字形、编辑和按钮。 TEdits 跨越多列,TButtons 跨越多列和多行。这些控件目前都与客户端对齐。

当我在 Windows 上编译和 运行 时,一切看起来和行为都符合预期。但是,在 Android 设备上(我尝试了两个,Android 6.0.1 和 Amazon FireOS)none 控件跨越不止一列或一行。它们每个都只有一个细胞那么大。 TEdits 不是跨越 6 列,而是只跨越 1 列; TButton 不是跨越 2 列和 2 行,而是跨越 1 列和 1 行。

为什么控件不能跨越 Android 上的多列或多行?

当 frame/form 获得子classed 或帧时,VCL 和 FireMonkey 都无法正确存储 TGridPanel / TGridPanelLayoutControlCollection放在另一个 frame/form.

此错误适用于 VCL 和 FMX。它早在 2011 年就已报告给旧 QC,但从未得到修复(示例:#92298, #123225)。

示例:将 TGridPanelLayoutTButton 放在 TFrame 上:

object GridPanelLayout1: TGridPanelLayout
    (...)   
    ControlCollection = <
      item
        Column = 0
        ColumnSpan = 2
        Control = Button1
        Row = 0
        RowSpan = 2
      end>
    object Button1: TButton
      Align = Client
      Size.Width = 421.000000000000000000
      Size.Height = 257.000000000000000000
      Size.PlatformDefault = False
      TabOrder = 0
      Text = 'Button1'
    end
end 

当您稍后子class 框架时,IDE 往往会为它从基础 class 继承的组件存储大量冗余属性。通常在第一次按 F9 后,ColumnSpanRowSpan 属性会无缘无故地被删除。在 subclass 上,它看起来像这样:

inherited GridPanelLayout1: TGridPanelLayout
    (...)
    ControlCollection = <
        item
            Column = 0
            Control = Button1
            Row = 0
        end>
    inherited Button1: TButton
        Size.Width = 210.500000000000000000
        Size.Height = 128.500000000000000000
    end
end

请注意尺寸 属性 是如何变化的。此外,ControlCollection 项目得到重新定义,但 ColumnSpanRowSpan 属性完全丢失。这就是原因。

这个错误适用于您,因为在 FMX 中,特定平台的专用视图是作为 master view.[=26 的子class实现的=]

版本控制系统有助于检测冗余属性何时潜入 DFM 文件。在上面的示例中,当您的 subclass 不更改它时,完全删除 inherited GridPanelLayout1 块是合法的。此外,我建议您在没有打开表单设计器 window 的情况下构建您的项目,因为它通常会损坏您的 DFM 文件并在每次机会时重新添加冗余属性。