Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 德尔福,什么';是TcxGrid或TDataSet中最快的记录访问方法_Delphi_Tcxgrid_Tdataset - Fatal编程技术网

Delphi 德尔福,什么';是TcxGrid或TDataSet中最快的记录访问方法

Delphi 德尔福,什么';是TcxGrid或TDataSet中最快的记录访问方法,delphi,tcxgrid,tdataset,Delphi,Tcxgrid,Tdataset,我使用Delphi2007和TcxGrid来显示文件库的内容。数据库包含有关文件类型、名称、路径和扩展名的信息 在测试中,我通过TDataSet将1700条记录加载到网格中。我还在网格中为另外3个需要计算的字段腾出空间。它们是文件是否存在、文件大小和修改日期 我的目标是向用户显示存储的所有信息(这很好,速度也很快),然后在后台线程中找到其他三个数据字段的信息,然后将它们插入TcxGrid。这个问题与我正在做的线程无关。工作正常 我的问题是,当我访问已经构建的网格中的字段时,访问这些字段的速度会大

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

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

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

我的问题是,当我访问已经构建的网格中的字段时,访问这些字段的速度会大大减慢。我试过两种不同的方法

  • grad.DataController.Values[RecordIndex,FieldIndex]——但这是一个变体,我怀疑这就是它如此缓慢的原因

  • Grid.DataController.DataSet.FindFirst Grid.DataController.DataSet.FindNext Grid.DataController.DataSet.Fields[FieldIndex] 但是使用这种“搜索”方法和我尝试的第一种方法一样慢。定位和移动速度也很慢


  • 长话短说,访问记录的最快方法是什么?

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

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

    我认为使用不支持db的TcxGridTableView或TcxBandedGridTableView

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

    即使有db应用程序,也可以在初始化时加载非db版本的视图,然后处理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
    

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

    谢谢Lieven的评论,因为这是我问题的解决方案。感谢Gad和Daniel对我的回答


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

    我知道这是一个旧线程,但我要提到的是,将网格切换到使用提供者模式是提高加载速度的另一种方法,因为它本质上将网格加载转化为虚拟操作。(只有在需要显示或其他数据访问时才会加载记录。)之后,DataController会缓存这些记录,因此加载后访问速度非常快。

    您对其进行了分析吗?您是否已将每个更新放在开始-结束更新之间?您是否将每个更新都放在启用-禁用控件之间?这实际上有多慢。对于1700条记录,应该不会超过几毫秒。很高兴知道。感谢您与我们分享结果。