Delphi、TCXGRIDまたはTDATASETで最も速いレコードアクセス方法は何ですか

StackOverflow https://stackoverflow.com/questions/4080196

  •  28-09-2019
  •  | 
  •  

質問

Delphi 2007とTCXGridを使用して、ファイルライブラリの内容を表示しています。データベースには、ファイル、名前、パス、および拡張機能の種類に関する情報があります。

テストでは、TDATASETを介して1700のレコードをグリッドにロードしています。また、まだ計算されていない3つのフィールドのためにグリッド内のスペースを作ります。ファイルが存在する場合、ファイルのサイズ、日付が変更された場合です。

私の目標は、バックグラウンドスレッドで保存されているすべての情報をユーザーにすべての情報を表示し、他の3つのデータフィールドの情報を見つけて、tcxgridに挿入することです。この質問は、私がやっているスレッドとは何の関係もありません。その正常に動作しています。

私の問題は、すでに構築されているグリッド内のフィールドにアクセスすると、アクセスすると大きな減速があることです。私は2つの異なる方法を試しました...

  1. grid.datacontroller.values [RecordIndex、fieldIndex] - しかし、これはバリアントであり、それがとても遅い理由であると思います

  2. grid.datacontroller.dataset.findfirst grid.datacontroller.dataset.findnext grid.datacontroller.dataset.fields [fieldindex]しかし、この「シーク」メソッドを使用することは、私が試した最初の方法と同じくらい遅いです。 LocateとMovebyも遅くなります。

長い質問が短い、レコードにアクセスする最速の方法は何ですか?

役に立ちましたか?

解決 3

更新コードは、Begin/Endの更新内にある必要がありました。

私の問題の解決策だったので、あなたのコメントをありがとうLievenに感謝します。そして、GadとDanielに私が学んだ回答をありがとう。

これは、昨日コードを投稿する時間がもっとあった人にとっては、これはもっと明らかでした。

他のヒント

また、TCXGRIDDBTABLEVIEWまたはTCXGRIDTABLEVIEWを使用しているかどうかについても言及してください。

非DB認識TCXGridTableViewまたはTCXBandedGridTableViewを使用していると思います

view.datacontroller.values [RecordIndex、fieldIndex]が最速です。

DBアプリケーションがある場合でも、初期化に関する非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

最初に欠落したデータをAppldingしてテーブル/データセットを使用してから、すべてのフィールドをデータバウンドとして表示できます。

これは古いスレッドであることは知っていますが、グリッドをプロバイダーモードの使用に切り替えることは、基本的にグリッドの負荷を仮想操作に変えるため、負荷速度を改善するもう1つの方法であることに言及します。 (レコードは、ディスプレイやその他のデータアクセスに必要になるまでロードされません。)その後、DataControllerはそれらをキャッシュするため、アクセスがロードされると非常に高速になります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top