为什么控件不会在 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
/ TGridPanelLayout
的 ControlCollection
放在另一个 frame/form.
此错误适用于 VCL 和 FMX。它早在 2011 年就已报告给旧 QC,但从未得到修复(示例:#92298, #123225)。
示例:将 TGridPanelLayout
和 TButton
放在 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 后,ColumnSpan
和 RowSpan
属性会无缘无故地被删除。在 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
项目得到重新定义,但 ColumnSpan
和 RowSpan
属性完全丢失。这就是原因。
这个错误适用于您,因为在 FMX 中,特定平台的专用视图是作为 master view.[=26 的子class实现的=]
版本控制系统有助于检测冗余属性何时潜入 DFM 文件。在上面的示例中,当您的 subclass 不更改它时,完全删除 inherited GridPanelLayout1
块是合法的。此外,我建议您在没有打开表单设计器 window 的情况下构建您的项目,因为它通常会损坏您的 DFM 文件并在每次机会时重新添加冗余属性。
我有一个带有 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
/ TGridPanelLayout
的 ControlCollection
放在另一个 frame/form.
此错误适用于 VCL 和 FMX。它早在 2011 年就已报告给旧 QC,但从未得到修复(示例:#92298, #123225)。
示例:将 TGridPanelLayout
和 TButton
放在 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 后,ColumnSpan
和 RowSpan
属性会无缘无故地被删除。在 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
项目得到重新定义,但 ColumnSpan
和 RowSpan
属性完全丢失。这就是原因。
这个错误适用于您,因为在 FMX 中,特定平台的专用视图是作为 master view.[=26 的子class实现的=]
版本控制系统有助于检测冗余属性何时潜入 DFM 文件。在上面的示例中,当您的 subclass 不更改它时,完全删除 inherited GridPanelLayout1
块是合法的。此外,我建议您在没有打开表单设计器 window 的情况下构建您的项目,因为它通常会损坏您的 DFM 文件并在每次机会时重新添加冗余属性。