Delphi 德尔福,什么';是TcxGrid或TDataSet中最快的记录访问方法
我使用Delphi2007和TcxGrid来显示文件库的内容。数据库包含有关文件类型、名称、路径和扩展名的信息 在测试中,我通过TDataSet将1700条记录加载到网格中。我还在网格中为另外3个需要计算的字段腾出空间。它们是文件是否存在、文件大小和修改日期 我的目标是向用户显示存储的所有信息(这很好,速度也很快),然后在后台线程中找到其他三个数据字段的信息,然后将它们插入TcxGrid。这个问题与我正在做的线程无关。工作正常 我的问题是,当我访问已经构建的网格中的字段时,访问这些字段的速度会大大减慢。我试过两种不同的方法Delphi 德尔福,什么';是TcxGrid或TDataSet中最快的记录访问方法,delphi,tcxgrid,tdataset,Delphi,Tcxgrid,Tdataset,我使用Delphi2007和TcxGrid来显示文件库的内容。数据库包含有关文件类型、名称、路径和扩展名的信息 在测试中,我通过TDataSet将1700条记录加载到网格中。我还在网格中为另外3个需要计算的字段腾出空间。它们是文件是否存在、文件大小和修改日期 我的目标是向用户显示存储的所有信息(这很好,速度也很快),然后在后台线程中找到其他三个数据字段的信息,然后将它们插入TcxGrid。这个问题与我正在做的线程无关。工作正常 我的问题是,当我访问已经构建的网格中的字段时,访问这些字段的速度会大
长话短说,访问记录的最快方法是什么?您可以使用表/数据集,首先添加缺少的数据,然后将所有字段显示为datbound。还请说明您使用的是TcxGridDBTableView还是TcxGridTableView 我认为使用不支持db的TcxGridTableView或TcxBandedGridTableView View.DataController.Values[RecordIndex,FieldIndex]是最快的 即使有db应用程序,也可以在初始化时加载非db版本的视图,然后处理DataController事件以检测数据更改,并发出相应的SQL命令以更新数据库 您可以按如下方式填充视图:
class procedure TForm1.FillView(const View: TcxGridBandedTableView; const Sql: string);
var
Reader: TMyOrmDataReader;
i: Integer;
begin
Assert(Assigned(View), 'View is not assigned parameter.');
with View.DataController do
begin
BeginFullUpdate;
try
Reader := TMyOrm.GetDataReader(SQL);
try
i := 0;
RecordCount := 50 * 1000; // make it something big in order to avoid constant resizing by 1
while Reader.Read do
begin
// Fill the view
Values[i, 0] := Reader.GetInt32(0);
Values[i, 1] := Reader.GetString(1);
Inc(i);
end;
RecordCount := i - 1;
finally
Reader.Free;
end;
finally
EndFullUpdate;
end;
end;
end;
然后访问以下值:
View1.DataController.Values[View1.DataController.FocusedRecordIndex, View1Column1.Index].AsString
更新代码需要在开始/结束更新中,这是我的大问题 谢谢Lieven的评论,因为这是我问题的解决方案。感谢Gad和Daniel对我的回答
如果我昨天有更多的时间发布一些代码,这对每个人来说都会更加明显。我知道这是一个旧线程,但我要提到的是,将网格切换到使用提供者模式是提高加载速度的另一种方法,因为它本质上将网格加载转化为虚拟操作。(只有在需要显示或其他数据访问时才会加载记录。)之后,DataController会缓存这些记录,因此加载后访问速度非常快。您对其进行了分析吗?您是否已将每个更新放在开始-结束更新之间?您是否将每个更新都放在启用-禁用控件之间?这实际上有多慢。对于1700条记录,应该不会超过几毫秒。很高兴知道。感谢您与我们分享结果。