我的C++CAD应用程序维护用户建模操作的日志,以便可以取消应用和重新应用。任何特定的项目可能只包含几个操作,也可能包含数十万个操作。我已经有了自己的数据结构,可以以高效内存的方式管理这些数据,而且一直运行良好。但现在我添加了一个功能,允许用户在网格中检查他的操作日志。(我使用的是Embarcadero RAD Studio 2010;所有GUI都使用VCL。)
目前,我正在使用TDBGrid组件向用户显示行中的操作数据。以下是我如何连接我的组件:
TDBGrid.DataSource=TDataSource
TDataSource.DataSet=一个TClientDataSet
TClientDataSet.ProviderName=TDataSetProvider
TDataSetProvider.DataSet=项目数据集
ProjectDataSet是我从TDataSet派生的类。
因为我是从自己的数据结构而不是数据库中提取操作数据,所以我重写了ProjectDataSet类中的GetFieldData和GetRecord函数(以及其他几个函数),以便它直接从自己的数据库结构中返回数据(而不执行任何数据库查询)。这是有效的。
为了在显示大量操作时最大限度地减少内存使用,我在TClientDataSet中设置了"FetchOnDemand"属性,并将"PacketRecords"设置为100。因此,最初只有前100个操作出现在网格中。一旦用户滚动到网格底部,接下来的100个操作将由TClientDataSet自动获取并显示在网格中。
所有这些都很有效。我的问题是,当用户在网格中滚动时,TClientDataSet会不断获取越来越多的记录,而不会释放任何记录。因此,如果用户在一个非常大的项目中向下滚动足够远,我最终会耗尽内存。
所以,我的问题是:让这个GUI工作的最佳方式是什么?从本质上讲,我希望网格表现得像一个电子表格。我希望用户能够在操作列表中上下滚动(或跳到特定行),无论有多少操作,我也不希望GUI组件在内存中保留很多用户不迫切需要的东西。
我假设TDBGrid(或其他一些VCL组件)被设计为能够通过一次只获取几个记录来显示任意大的数据集,那么这意味着如何实现呢?
如果我需要重新思考GUI,那没关系。但如果我能用同一个GUI显示10个操作项目或10万个操作项目,那就太好了。
谢谢。
尝试VirtualTreeView它是一个Delphi组件,但它可以在C++Builder中工作。您必须将数据填充功能移植到新的网格。
VT速度非常快,使用起来非常方便。