Delphi,什么是TCXGRID或TDATASET中最快的记录访问方法
题
我正在使用Delphi 2007和TCXGrid来显示文件库的内容。数据库包含有关文件,名称,路径和扩展名的类型的信息。
在测试中,我将1700个记录通过TDATASET加载到网格中。我还在网格中腾出空间,还有3个需要计算的尚需计算的字段。它们是如果文件存在,文件的大小以及修改日期。
我的目标是向用户展示存储的所有信息(效果很好并且很快),然后在背景线程中找到其他三个数据字段的信息,然后将其插入TCXGrid。这个问题与我正在做的线程无关。它的工作正常。
我的问题是,访问已经构造的网格中的字段时,我访问它时会有所放缓。我尝试了两种不同的方法...
grid.datacontroller.values [RecordIndex,fieldIndex] - 但这是一个变体,我怀疑这就是为什么它如此慢的原因
grid.datacontroller.dataset.findfirst grid.datacontroller.dataset.findnext grid.datacontroller.dataset.fields.fields.fields [fieldIndIndex],但是使用此“ seek”方法与我尝试过的第一个方法一样慢。定位和Moveby也很慢。
这么长的问题简短,访问记录的最快方法是什么?
解决方案 3
更新代码需要在开始/结束更新之内是我的大问题。
谢谢Lieven的评论,因为这是解决我问题的方法。并感谢Gad和Daniel的回答。
如果我昨天有更多时间发布一些代码,这对每个人来说都是更明显的。
其他提示
还请提及您是在使用TCXGridDBTableView还是TCXGridTableView?
我认为使用非db的tcxgridtableview或tcxbandedgridtableview
view.datacontroller.values [recordIndex,fieldIndex]是最快的。
即使您有DB应用程序,您也可以在初始化和处理DataController事件上加载视图的非DB版本,以检测数据更改并发出相应的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
您可以首先使用表/数据集使用丢失的数据,然后将所有字段显示为DATBOUND。
我知道这是一个旧的线程,但是我会提到,将网格切换到使用提供商模式是提高加载速度的另一种方法,因为它本质上将网格加载变成虚拟操作。 (在需要显示或其他数据访问需要之前,才加载记录。)之后,Datacontroller缓存它们,因此加载一旦加载,访问就非常快。