Windows2000,VC6,MFC,SDIでFormViewにMSFlexGridを貼り付けて
データを表示しているのですが、なかなか速度があがりません。
クラスのメンバを見ても、一行しか挿入ができないので、ループして1行挿入を
繰り返しています。
一気に複数行を挿入することは不可能なのでしょうか?
知っている方がいらしたら、ご教授ください。
※グリッドを以下のようにロックしたりしてみてはいるのですが。。。
<例>
pGrid = ( CMSFlexGrid* )GetDlgItem( IDC_MSFLEXGRID );
pGrid->SetRedraw( FALSE );
for( i=0 ; i<30000 ; i++ )
{
pGrid->AddItem(StrAddItem,index);
}
pGrid->SetRedraw( TRUE );
実際に30000件を挿入して、表示するのにどれくらいの時間がかかっていますか。
後、MSFlexGridで30000件を表示するのは実用的でないと思いますが。
私の場合は、1000件を越す場合は、ページングしています。
空データを挿入するだけの処理で、3万件で1分くらいです。
やっぱり実用的でないでしょうか?
しかし、リストビューより早いと踏んでいるのですが。。。
※どうしてもやるんであれば、やっぱりページングすべきですね。
SetRowsで始めに行数を決定して、SetTextMatrixで書くという方法では
ダメですか?
pGrid->SetRows(30000);
for( i=0 ; i<30000 ; i++ )
{
// pGrid->AddItem(TEST,CComVariant(i+1) );
pGrid->SetTextMatrix(i+1,0,test);
}
または選択されたセルに対してSetClipを使ってみるとか。(一気にできるかも)
セルの区切り = 0x09
行の区切り = 0x0d
を含む文字列を引数に指定します。
多分こんな感じ(入力したい位置のセルを選択して)
pGrid->SetClip(test\x09test\x0dtest);
こっちは早いかどうかは確かめてません。
<SetRowsで始めに行数を決定して、SetTextMatrixで書くという方法では
<ダメですか?
こちらの方が早いです!!
<または選択されたセルに対してSetClipを使ってみるとか。(一気にできるかも)
<多分こんな感じ(入力したい位置のセルを選択して)
< pGrid->SetClip(test\x09test\x0dtest);
SetClipもやてみましたが、最上行の最左列のひとつしかセットされませんでした。。。
何かほかに処理が必要でしょうか?
SetRowsやSetColsとかもやってみたのですが。。。
多分、セルが選択状態になっていなかったんだと思います。
pGrid->SetRow(1);
pGrid->SetCol(1);
pGrid->SetRowSel(3);
pGrid->SetColSel(3);
pGrid->SetClip(test\x09test\x0dtest);
などで値をいれたい範囲を選択してあげればうまくいくと思います。
コントロールのプロパティで複数行選択不可とかにしているときは
一時的に複数選択を許可なりにしないとダメかも知れません。
SetClipでも出来ました!!
しかし、一気にグリッド表示しようとすると、それだけの文字列を作成
しなければならないのと、1行づつSetClipしてもみましたが、SetTextMatrix
よりも遅かったです。
現状、SetTextMatrixを使用することにしました。
ちなみに、グリッドのMAXは3万行~4万行の間みたいです。。。。
スピードアップできてよかったです。
私も詳しく調べたわけではないので、気分的にはSetClipの
方が早いかと思っていました。
今後の参考のため、もしお手数でなければAddItemの時より
どのくらい早くなったか教えていただけますか?
プログレスバーを出したり、メッセージを飛ばしたりと処理が間に入っていますが、
8列30000行の作成で、
AddItemでおよそ45秒
SetTextMatrixでおよそ25秒くらいです。
SetTextMatrixの方が動作が安定しているみたいです。
AddItemだと、30000行に近づくにつれて遅くなりました。
結局30000件だと足りないので、ページングしないといけないっぽいです。。。
グリッドをいっぱい貼り付けて可視・不可視を切り替えるしかないような。。。
メモリをいっぱい食いつぶしそうで怖いですが。。。