Delphi Firemonkey和大量数据

Delphi Firemonkey和大量数据,delphi,delphi-xe2,firemonkey,Delphi,Delphi Xe2,Firemonkey,我刚刚看了Firemonkey的网格实现,结果证明它是一个非常简单的实现(只有1800行,对于网格实现来说似乎不多)。它几乎不进行自定义绘制,而是聚合了许多其他控件,这似乎是Firemonkey风格的操作方式 例如,每列保留一个控件数组-每个单元格一个控件。对于一个有1000000行的普通文本列,网格将在内存中保留1000000个编辑控件——这对我来说似乎有点疯狂。(编辑:现在不太确定这个假设是否正确。它似乎考虑了单元格的可见性,这可能意味着它确实提供了类似虚拟模式的功能,但我不太确定…) 我的

我刚刚看了Firemonkey的网格实现,结果证明它是一个非常简单的实现(只有1800行,对于网格实现来说似乎不多)。它几乎不进行自定义绘制,而是聚合了许多其他控件,这似乎是Firemonkey风格的操作方式

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

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


感谢您的输入。

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

是的:我做了一些测试,因为我们有10万条记录的TMS网格:-)


如果您使用OnGetCellText(而不是TStringgrid,它的速度非常慢,有很多记录,特别是TMS grid(基于VCL stringgrid)),它的速度非常快(OnGetCellText只检索可见单元格的数据)。我们将此技术与数据对象结合使用(这些对象已经加载,因此无需再次用字符串值填充网格的每个单元格…),TMS和FMX网格都非常快,记录数达到或超过100000条

FireMonkey成功的关键在于第三方组件制造商IMO(即DevExpress、TMS等)的采用/承诺。FireMonkey提供了一个可以生成本机跨平台应用程序的环境,这是一个巨大的挑战。希望这些组件构建者中的一些人会为此投入一些重要的资源(来吧,DevExpress说一些积极的东西…)。我对这个框架的潜力感到兴奋,但在我的托盘上有我最喜欢的第三方控件之前,我无法产生任何有意义的东西。(我构建基于网格的客户机-服务器应用程序)@Bob A DevExpress已经声明()他们没有Firemonkey控件的计划。如果调整控制真的需要完全重写(这似乎是普遍的看法),那么我很确定TMS也不会在未来几个月内发布。我的直觉是,组件供应商在FMX处于当前状态时会非常谨慎地承诺FMX。我认为他们会等着看风向如何,然后再将宝贵的资源投资于另一头白象。@David-OSX和IOS平台是一个有吸引力的胡萝卜,FMX是实现这一目标的工具。“我想他们迟早会回来的……”鲍勃,如果迹象表明FMX的质量足够好,我会同意。虽然它显然有潜力,但我所看到的所有迹象表明,在它准备好进入黄金时段之前,它需要更多的改进。谢谢!我用
OnGetValue
事件尝试了
TGrid
。添加大量节点似乎相当快,但在20000个项目的某个地方它停止工作(没有可见的文本)。另外,滚动看起来很麻烦。你有演示项目吗?我可以为此创建一个QC。我所做的就是在表单上放置一个
TGrid
,在
FromCreate
中将
行数设置为25000,并在
OnGetValue
事件中执行
值:='Blub'
。@Smasher:还要注意FireMonkey使用的控件通常没有窗口句柄,因此它们非常轻量级。它们完全是在代码中完成的。在网格中重复使用这些控件与苹果的Cocoa类似。在这里,控件仅仅是一个容器,其中包含一个或多个负责绘图等的“单元格”。Cocoa NSTableView有一个单元格队列,当视图更改时,这些单元格将被重复使用,并且它们只覆盖整个网格的可见(和可单击)区域。奇怪的是,带有1列和25000行的TGrid,OnGetValue='test'jsut有效。。。