我正在使用Delphi 2007和TcxGrid来显示文件库的内容。数据库中包含有关文件类型,名称,路径和扩展名的信息。
在测试中,我正在通过TDataSet将1700条记录加载到网格中。我还在网格中为3个尚待计算的字段腾出空间。它们是文件是否存在,文件大小和修改日期。
我的目标是向用户显示所有已存储的信息(效果很好且速度很快),然后在后台线程中查找其他三个数据字段的信息,然后将其插入TcxGrid。这个问题与我正在执行的线程几乎没有关系。它的工作正常。
我的问题是,当我访问它时,访问已经构造的网格中的字段会大大降低速度。我尝试了两种不同的方法...
Grid.DataController.Values [RecordIndex,FieldIndex]-但这是一个变体,我怀疑这就是为什么它这么慢
Grid.DataController.DataSet.FindFirst
Grid.DataController.DataSet.FindNext
Grid.DataController.DataSet.Fields [FieldIndex]
但是,使用这种“搜索”方法的速度与我尝试的第一种方法一样慢。定位和移动也很慢。
这么长的问题很简短,访问记录的最快方法是什么?
最佳答案
还请提及您使用的是TcxGridDBTableView还是TcxGridTableView?
我认为使用非数据库感知的TcxGridTableView或TcxBandedGridTableView与
View.DataController.Values [RecordIndex,FieldIndex]是最快的。
即使您具有数据库应用程序,也可以在初始化时加载视图的非数据库版本,然后处理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