12

我刚刚看了一下 Firemonkey 的网格实现,结果发现它是一个非常简单的实现(只有 1800 行,对于网格实现来说似乎并不多)。它几乎没有自定义绘画,而是聚合了许多其他控件——这似乎是 Firemonkey 的处事风格。

例如,每一列都有一个控件数组——每个单元格一个。对于具有 1,000,000 行的普通文本列,网格将在内存中保留 1,000,000 个编辑控件 - 这对我来说似乎有点疯狂。(编辑:现在不太确定这个假设是否正确。它似乎考虑了单元格的可见性,这可能意味着它确实提供了类似虚拟模式的东西,但我不太确定......

我的问题:毫无疑问,Firemonkey 的这种组件聚合设计看起来简单而优雅,但它真的可以很好地适应必须在网格中显示的数据量吗?我无法想象它在大量行中表现良好。Firemonkey 处理大量数据的方式是什么?

感谢您的任何意见。

4

1 回答 1

11

FireMonkey 网格仅具有对可见行数的控制。因此,如果您有一个包含 10 个可见行和 3 个列的网格,它将创建 30 个单元格控件。用 10.000 条记录填充网格是没有问题的:当您滚动时,30 个单元格控件被重用并映射到新的可见行。

是的:我对此进行了一些测试,因为我们有具有 100.000 条记录的 TMS 网格 :-)。

如果您使用 OnGetCellText(所以不是 TStringgrid,它非常慢,记录很多,尤其是 TMS 网格(基于 VCL stringgrid))它非常快(OnGetCellText 只检索可见单元格的数据)。我们将此技术与我们的数据对象结合使用(这些已加载,因此无需再次用字符串值填充网格的每个单元格......)并且 TMS 和 FMX 网格都非常快,有 100.000 条或更多记录!

于 2011-09-19T13:03:10.580 回答