使用VCL组件在网格中显示非常大的数据集

时间:2012-02-23 15:34:22

标签: c++builder vcl tclientdataset tdbgrid tdataset

我的C ++ CAD应用程序维护用户建模操作的日志,以便可以取消应用和重新应用它们。任何特定项目可能只包含几个操作,也可能包含数十万个操作。我已经拥有自己的数据结构来以一种节省内存的方式管理这些数据,而且这种方式运行良好。但现在我添加了一个允许用户在网格中检查其操作日志的功能。 (我使用的是Embarcadero RAD Studio 2010;所有GUI都使用VCL。)

目前,我正在使用TDBGrid组件向用户显示行中的操作数据。以下是我连接组件的方法:

  

TDBGrid.DataSource =一个TDataSource

     

TDataSource.DataSet =一个TClientDataSet

     

TClientDataSet.ProviderName = TDataSetProvider

     

TDataSetProvider.DataSet =一个ProjectDataSet

     

ProjectDataSet是从TDataSet派生的类。

因为我从我自己的数据结构而不是从数据库中提取操作数据,所以我在我的ProjectDataSet类中重写了GetFieldData和GetRecord函数(以及其他几个函数),以便它直接从我自己的数据结构中返回数据(不进行任何数据库查询)。这很有效。

为了在显示大量操作时最小化内存使用,我在TClientDataSet中设置了'FetchOnDemand'属性,并将'PacketRecords'设置为100.因此,最初只有前100个操作出现在网格中。一旦用户滚动到网格的底部,TClientDataSet将自动提取接下来的100个操作并显示在网格中。

所有这些都很有效。我的问题是,当用户滚动网格时,TClientDataSet会继续获取越来越多的记录,而不会释放任何记录。因此,如果用户在一个非常大的项目中向下滚动足够远,我最终会耗尽内存。

所以,我的问题是:使这个GUI工作的最佳方法是什么?基本上,我希望网格表现得像电子表格。我希望用户能够在操作列表中上下滚动(或跳转到特定行),无论有多少操作,我都不希望GUI组件在内存中保留很多内容用户并不迫切需要。

我假设TDBGrid(或其他一些VCL组件)被设计为能够通过一次只获取几条记录来显示任意大的数据集,那么它是如何完成的呢?

如果我需要重新考虑GUI,那没关系。但如果我可以使用相同的GUI来显示10个操作项目或100,000个操作项目,那将是非常好的。

感谢。

1 个答案:

答案 0 :(得分:1)

尝试将VirtualTreeView作为Delphi组件,但它在C ++ Builder中可以正常工作。您必须将数据填充功能移植到新网格。

VT非常快速且易于使用。