我有一个带有GridPanelLayout的FireMonkey应用程序,与客户端对齐。它有6列16行。控件包括字形,编辑和按钮。 TEdits跨越多列,TButtons跨越多列和多行。目前控件都与客户端保持一致。
当我在Windows上编译和运行时,所有内容都会按预期运行。但是,在Android设备上(我试过两个,Android 6.0.1和Amazon FireOS),没有一个控件跨越多个列或行。他们每个人只有一个大单元。 TEdits不是跨越6个col,而是跨越1个col; TButtons不是跨越2列和2行,而是跨越1列和1行。
为什么控件跨越Android上的多个列或行?
答案 0 :(得分:2)
当框架/表单被子类化或框架放置在另一个框架/表单上时,VCL和FireMonkey都无法正确存储ControlCollection
/ TGridPanel
的{{1}}。
此错误适用于VCL和FMX。早在2011年就向旧质量控制报告过,但从未修复过(例如:#92298,#123225)。
示例:在TGridPanelLayout
上放一个TGridPanelLayout
TButton
:
TFrame
当您稍后对该框架进行子类化时,IDE倾向于为从基类继承的组件存储许多冗余属性。通常在第一次按F9后,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
和ColumnSpan
属性会被无理由删除。在子类上,它看起来像这样:
RowSpan
请注意Size属性的更改方式。此外,重新定义了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
属性完全丢失。这就是原因。
此错误适用于您,因为在FMX中,特定平台的专用视图是作为 master view 的子类实现的。
版本控制系统有助于检测冗余属性何时潜入DFM文件。在上面的示例中,当您的子类不更改它时,完全删除RowSpan
块是合法的。此外,我建议您在没有打开表单设计器窗口的情况下构建项目,因为它通常会破坏您的DFM文件并在每次机会时重新添加冗余属性。