StringGridの内容をクリップボードにCOPYしたい
Borland C++ Builder 5 を使っています。
StringGridの内容をクリップボードにCOPYするプログラムを作っています。
Excelに貼り付けるのが目的なので、Tab区切りのデータにしています。
下に示したソースで実現できましたが、非常に遅いのです。
100行とか200行ならアッという間なのですが、2,000行、3,000行となるとかなり待たされます。
時間を食っているのは(2)の部分のようです。
もう少しスマートに、短時間でCOPYしたいのですが、方法はないものでしょうか?
◆ソースの解説
StringGridの21列分を、行数だけクリップボードにCOPYします。
(1)
StringGridの各行、各列をLOOPしてセルに格納されている文字列長の合計を求めます。
Tab区切りにするため、各セルごと1バイト加算します。
また、各行ごと改行を入れるため、これも1バイト加算します。
(2)
合計容量が計算できたら、メモリーを動的確保し、もう一度LOOPをしながら、文字列をCOPYします。
セルごとにTab、行ごとに改行も追加します。
(3)
最後にクリップボードをクリアしてCOPYします。
int cnt = StringGrid1->RowCount;
int size = 0;
//StringGridのサイズ(文字長)をカウントする ------ (1)
for(i=0;i<cnt;i++){
for(k=0;k<21;k++){
size += strlen(StringGrid1->Cells[k][i].c_str()) + 1;
}
size++;
}
//メモリーを確保して、StringGridをCOPYする -------- (2)
cb = new char[size];
strcpy(cb,"");
for(i=0;i<cnt;i++){
for(k=0;k<21;k++){
strcat(cb,StringGrid1->Cells[k][i].c_str());
strcat(cb,"\t"); //Tab区切りの文字列にする
}
strcat(cb,"\n");
}
Clipboard()->Clear(); // -------- (3)
Clipboard()->AsText = cb;
なお、サイズがintに収まるかというチェックとか、メモリーの解放をする、といったことも必要ですが、記述を省略しました。
お礼
ご連絡ありがとうございます。 無事に教えて頂いた内容で出来ることができました。 StringGridの指定行の固定については面倒ということなので 違う方法を考えることにします。