Delphi,TcxGrid 或 TDataSet 中最快的记录访问方法是什么

标签 delphi tcxgrid tdataset

我正在使用 Delphi 2007 和 TcxGrid 来显示文件库的内容。该数据库包含有关文件类型、名称、路径和扩展名的信息。

在测试中,我通过 TDataSet 将 1700 条记录加载到网格中。我还在网格中为另外 3 个需要计算的字段腾出空间。它们是文件是否存在、文件大小和修改日期。

我的目标是向用户显示存储的所有信息(效果很好并且速度很快),然后在后台线程中查找其他三个数据字段的信息,然后将它们插入到 TcxGrid 中。这个问题与我正在做的线程几乎没有关系。它工作正常。

我的问题是,访问已构建的网格中的字段时,速度会大大减慢。我尝试了两种不同的方法...

  1. Grid.DataController.Values[RecordIndex,FieldIndex] - 但这是一个变体,我怀疑这就是它如此慢的原因

  2. Grid.DataController.DataSet.FindFirst Grid.DataController.DataSet.FindNext Grid.DataController.DataSet.Fields[FieldIndex] 但使用这种“寻找”方法与我尝试的第一种方法一样慢。定位和移动也很慢。

这么长的问题简短地说,访问记录的最快方法是什么?

最佳答案

另请说明您使用的是 TcxGridDBTableView 还是 TcxGridTableView?

我认为使用非数据库感知的 TcxGridTableView 或 TcxBandedGridTableView

View.DataController.Values[RecordIndex, FieldIndex] 是最快的。

即使您有一个数据库应用程序,您也可以在初始化时加载 View 的非数据库版本,然后处理 DataController 事件来检测数据更改并发出相应的 SQL 命令来更新数据库。

您可以像这样填充 View :

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

关于Delphi,TcxGrid 或 TDataSet 中最快的记录访问方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4080196/

相关文章:

sorting - Delphi 泛型 : TArray. 排序

delphi - 如何使用 Open Tools API 折叠插入的区域?

delphi - 循环cxGrid时如何访问TcxEditRepositoryComboBoxItem中的选定项目?

Delphi XE2数据集字段类型TStringField不支持Unicode?

delphi - 当客户端连接崩溃时如何释放服务器 DCOM 中的引用

delphi - OLE 自动化 - WORD 表格 (Delphi)

delphi - 调用 cxGrid Navigator 按钮的 Onclick 事件

delphi - 我如何知道用户将某些东西放到了 TcxGrid 的哪一行?

delphi - 我如何获取一个TDataset来存储空字符串而不是null?

delphi - 获取 TField 来自的表的名称