Delphi、TCXGRIDまたはTDATASETで最も速いレコードアクセス方法は何ですか
質問
Delphi 2007とTCXGridを使用して、ファイルライブラリの内容を表示しています。データベースには、ファイル、名前、パス、および拡張機能の種類に関する情報があります。
テストでは、TDATASETを介して1700のレコードをグリッドにロードしています。また、まだ計算されていない3つのフィールドのためにグリッド内のスペースを作ります。ファイルが存在する場合、ファイルのサイズ、日付が変更された場合です。
私の目標は、バックグラウンドスレッドで保存されているすべての情報をユーザーにすべての情報を表示し、他の3つのデータフィールドの情報を見つけて、tcxgridに挿入することです。この質問は、私がやっているスレッドとは何の関係もありません。その正常に動作しています。
私の問題は、すでに構築されているグリッド内のフィールドにアクセスすると、アクセスすると大きな減速があることです。私は2つの異なる方法を試しました...
grid.datacontroller.values [RecordIndex、fieldIndex] - しかし、これはバリアントであり、それがとても遅い理由であると思います
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はそれらをキャッシュするため、アクセスがロードされると非常に高速になります。