TClientDataSeまわりtの性能向上

解決


alt  2009-01-19 22:51:28  No: 33170

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

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


alt  2009-01-21 18:51:03  No: 33172

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

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

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

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

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

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

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


igy  2009-01-21 20:55:35  No: 33173

>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

igy様

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

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

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


alt  2009-01-24 02:16:15  No: 33175

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加