3

我正在使用 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] 但是使用这种“seek”方法和我尝试的第一种方法一样慢。定位和移动也很慢。

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

4

4 回答 4

2

还请提及您使用的是 TcxGridDBTableView 还是 TcxGridTableView?

我认为使用非分贝感知 TcxGridTableView 或 TcxBandedGridTableView

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

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

你可以像这样填充视图:</p>

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
于 2010-11-02T22:17:00.700 回答
1

您可以使用表/数据集首先附加丢失的数据,然后将所有字段显示为 datbound。

于 2010-11-02T22:14:20.900 回答
1

需要在开始/结束更新中的更新代码是我的大问题。

感谢 Lieven 的评论,因为它解决了我的问题。感谢 Gad 和 Daniel 的回复,我从中学到了。

如果我昨天有更多时间发布一些代码,这对每个人来说都会更加明显。

于 2010-11-03T13:27:49.460 回答
1

我知道这是一个旧线程,但我会提到将网格切换到使用 Provider 模式是提高加载速度的另一种方法,因为它本质上是将网格加载变成了虚拟操作。(在显示或其他数据访问需要记录之前,不会加载记录。)之后,DataController 会缓存它们,因此一旦加载,访问速度就会非常快。

于 2011-01-26T16:43:41.123 回答