3

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 も遅いです。

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

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

更新コードが開始/終了更新内にある必要があることが、私の大きな問題でした。

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

これは、昨日コードを投稿する時間があれば、誰にとってもより明白だったでしょう。

于 2010-11-03T13:27:49.460 に答える
1

最初にテーブル/データセットを操作して、欠落しているデータを追加してから、すべてのフィールドをデータバインドとして表示できます。

于 2010-11-02T22:14:20.900 に答える
1

これが古いスレッドであることは承知していますが、グリッドをプロバイダー モードを使用するように切り替えることは、基本的にグリッドの読み込みを仮想操作に変えるため、読み込み速度を向上させるもう 1 つの方法であることを述べておきます。(レコードは、表示またはその他のデータ アクセスに必要になるまでロードされません。) その後、DataController はそれらをキャッシュするため、ロード後のアクセスは非常に高速です。

于 2011-01-26T16:43:41.123 に答える