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

在测试中,我将1700个记录通过TDATASET加载到网格中。我还在网格中腾出空间,还有3个需要计算的尚需计算的字段。它们是如果文件存在,文件的大小以及修改日期。

我的目标是向用户展示存储的所有信息(效果很好并且很快),然后在背景线程中找到其他三个数据字段的信息,然后将其插入TCXGrid。这个问题与我正在做的线程无关。它的工作正常。

我的问题是,访问已经构造的网格中的字段时,我访问它时会有所放缓。我尝试了两种不同的方法...

  1. grid.datacontroller.values [RecordIndex,fieldIndex] - 但这是一个变体,我怀疑这就是为什么它如此慢的原因

  2. 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缓存它们,因此加载一旦加载,访问就非常快。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top