我正在使用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

09-27 10:50