- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:StringGridの内容をクリップボードにCOPYしたい)
Borland C++ Builder 5を使用してStringGridの内容をクリップボードにCOPYする方法
このQ&Aのポイント
- Borland C++ Builder 5で、StringGridの内容をクリップボードにCOPYするプログラムを作成していますが、処理が非常に遅いです。
- 現在の方法では、2,000行や3,000行といった大量のデータの場合に待たされることがあります。
- より効率的にスマートにCOPYする方法はあるのか、教えていただきたいです。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
strcatで毎回連結しているようですが、質問内容のソースコードでは毎回'\0'を探し出して、その後に文字列を連結しているため処理効率が落ちてしまいます。 以下のようにしてはどうでしょう。 追加宣言 int mcnt,mlp; (2)の部分のソースコード cb = new char[size]; cb[0] = '\0'; mcnt = 0; for(i=0;i<cnt;i++){ for(k=0;k<21;k++){ for(mlp=0;mlp<strlen(StringGrid1->Cells[k][i].c_str());mlp++){ cb[mcnt] = StringGrid1->Cells[k][i].c_str()[mlp]; mcnt++; } //Tab区切りの文字列にする cb[mcnt] = '\t'; mcnt++; } //行ごとに改行する。 cb[mcnt] = '\n'; mcnt++; } //最後に'\0'を付加。 cb[mcnt] = '\0'; mcnt++; 申し訳ありませんが、試してはいません。
お礼
hiro_knighさん、ありがとうございました。 >strcatで毎回連結しているようですが、質問内容のソースコードでは毎回'\0'を探し出して、その後に文字列を連結しているため処理効率が落ちてしまいます どうもそのようです。 試しに、次のようなstrcatのテストプログラムを作ってみました。 char Tmem[400001]=""; char moji[]="0123456789"; int i; for(i=0;i<20000;i++) strcat(Tmem,moji); 20,000回のLOOPで、約3秒かかりますが、倍の40,000回のLOOPでは、11秒もかかります。(ストップウォッチによる手動計測) 回数を倍にしただけなのに、時間は4倍弱掛かっています。 '\0'を探し出すのに時間が掛かっているようです。 アドバイスを参考に、kのLOOPを次のようにしました。 len = strlen(StringGrid1->Cells[k][i].c_str()); strncpy(&cb[st],StringGrid1->Cells[k][i].c_str(),len); cb[st + len] = '\t'; st = st + len +1; その結果、手動計測では測定不可能なほど早くなりました。 ありがとうございました。