我有一个带有 GridPanelLayout 的 FireMonkey 应用程序,与客户端对齐。它有 6 列和 16 行。控件包括字形、编辑和按钮。 TEdit 跨越多列,TButton 跨越多列和行。目前,控件全部与客户端对齐。
当我在 Windows 上编译和运行时,一切看起来和行为都符合预期。然而,在 Android 设备上(我尝试了两种,Android 6.0.1 和 Amazon FireOS),没有一个控件跨越超过一列或一行。它们每个都只有一个细胞那么大。 TEdit 不跨越 6 列,而是仅跨越 1 列; TButton 不是跨越 2 列和 2 行,而是跨越 1 列和 1 行。
为什么控件在 Android 上不会跨越多列或多行?
最佳答案
当框架/表单被子类化或框架被放置时,VCL 和 FireMonkey 都无法正确存储 TGridPanel
/TGridPanelLayout
的 ControlCollection
在另一个框架/表单上。
此错误适用于 VCL 和 FMX。早在 2011 年就已向旧 QC 报告过该问题,但从未得到修复(例如: #92298 、 #123225 )。
示例:将一个带有 TButton
的 TGridPanelLayout
拖放到 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
当您稍后对框架进行子类化时,IDE 往往会为其从基类继承的组件存储大量冗余属性。通常,在第一次按 F9 后,ColumnSpan
和 RowSpan
属性会无缘无故地被删除。在子类上,它看起来像这样:
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
请注意 Size 属性的变化情况。此外,ControlCollection
项被重新定义,但 ColumnSpan
和 RowSpan
属性完全丢失。这就是原因。
此错误适用于您,因为在 FMX 中,特定平台的专用 View 是作为 master view 的子类实现的。 。
版本控制系统有助于检测冗余属性何时潜入 DFM 文件中。在上面的示例中,当您的子类不更改继承的 GridPanelLayout1 block 时,完全删除它是合法的。此外,我建议您在不打开表单设计器窗口的情况下构建项目,因为它通常会损坏您的 DFM 文件并在每次机会时重新添加冗余属性。
关于android - 为什么 Android FireMonkey 应用程序中的控件不能跨越多列或多行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48758081/