TClientDataSeまわりtの性能向上

解決


alt  2009-01-19 22:51:28  No: 33170  IP: [192.*.*.*]

Delphi 6 Enterpriseを使っております。

1レコードあたり40カラムの素データを、TClientDataSetを使ってTcxGridに描画するコードを書いています。

40カラムそれぞれにイベントハンドラTcxCustomGridTableItemStyles.OnGetContentStyleを用意し、条件を満たした場合にはStyleを変更してセルに色をつけます。

上記の処理の高速化を図りたいと考え、頭を抱えています。
言ってしまえばTClientDataSetまわりのチューニングとでも言うのでしょうか。
Gridの描画の一時停止と再開のためにBeginUpdateとEndUpdateを使用しています。
どのくらい効果があるか分かりませんが、ClientDataSet1.LogChanges := False;も記述してあります。
それでも、1000レコードくらいの素データを読み込むと12秒近くかかってしまうのが現状です。

何か手立てがあればぜひお知恵を拝借したいと存じます。
恐れ入りますが、宜しくお願いします。

編集    削除
HOta  2009-01-20 16:12:46  No: 33171  IP: [192.*.*.*]

データーベースは何をどのようにお使いでしょうか?
TcxGridはカスタムコンポーネントでしょうが、どういう処理をしているか判りません。
また、1画面あたり1000レコードを読み込むのは時間がかかると思います。画面にはそんなに沢山表示しても、扱う人は見えません。

編集    削除
alt  2009-01-21 18:51:03  No: 33172  IP: [192.*.*.*]

ご回答ありがとうございます。


>データーベースは何をどのようにお使いでしょうか?

CSVファイルを読み込んで、全データをTClientDataSetに代入しています。
「キャッシュに持っている」と表現すればよいのでしょうか。


>TcxGridはカスタムコンポーネントでしょうが、どういう処理をしているか判りません。

TcxGridはDBGridに似た外部コンポーネントです。
TDataSourceを使って、TClientDataSetのデータをTcxGridに表示させています。


>また、1画面あたり1000レコードを読み込むのは時間がかかると思います。画面にはそんなに沢山表示しても、扱う人は見えません。

なるほど!
現状では「画面の高さ=30レコード分」ですので、
画面をスクロールしない限り、一度に30レコードしか見れません。
描画が必要なものだけVisibleにするような書き方をすれば解決できそうです…。

編集    削除
igy  2009-01-21 20:55:35  No: 33173  IP: [192.*.*.*]

>CSVファイルを読み込んで、全データをTClientDataSetに代入しています。

この部分で時間がかかっているのですか?
# このとき代入するまえに、ClientDataSet1.DisableControlsメソッドを呼び出し、
# 完了後、ClientDataSet1.EnableControlsメソッドを呼び出してますか?

それとも、

>40カラムそれぞれにイベントハンドラTcxCustomGridTableItemStyles.OnGetContentStyleを用意し、
>条件を満たした場合にはStyleを変更してセルに色をつけます。

これの影響で時間がかかっているのですか?

ちなみに試したところ、
MyBaseで、xmlファイル(1000レコード・40カラム)をLoadFromFileメソッドで読み込んでも、
TClientDataSet - TDataSource - TDBGrid
で、1秒以内で表示されます。

編集    削除
alt  2009-01-21 22:34:03  No: 33174  IP: [192.*.*.*]

igy様

回答してくださりありがとうございます。

># このとき代入するまえに、ClientDataSet1.DisableControlsメソッドを呼び出し、
># 完了後、ClientDataSet1.EnableControlsメソッドを呼び出してますか?

呼び出していませんでした…。
書き加えたところ、処理速度が格段に向上しました!
ありがとうございました。

編集    削除
alt  2009-01-24 02:16:15  No: 33175  IP: [192.*.*.*]

解決時の"チェック"を忘れていました。

編集    削除