たびたびお世話になります.Kです.
環境はVC++6.0,OSはXP-SP2で,SDKでプログラムをつくっています.
以下のようなソースを書いています.
char lpBuffer[MAX_PATH];
wsprintf(lpBuffer,あいうえお\r\n);
SetDlgItemText( hWnd, IDC_EDIT1, lpBuffer);
wsprintf(lpBuffer,かきくけこ);
SetDlgItemText( hWnd, IDC_EDIT1, lpBuffer);
hWnd→ダイアログのウインドウハンドル
IDC_EDIT1→表示させたいエディットボックス
ここで,エディット内に
あいうえお
かきくけこ
と改行させて表示させたいのですが,『あいうえお』が更新されて
かきくけこ
だけの表示になってしまいます.
どなたか,改行の仕方をお教えてください.おねがいします.
wsprintf(lpBuffer,あいうえお\r\nかきくけこ);
SetDlgItemText( hWnd, IDC_EDIT1, lpBuffer);
※ SetDlgItemTextは追記ではなく上書きです。
REEさんありがとうございます.
説明が足らなかったのですが,30行くらいの配列に入った実験のデータを改行をして,表
示させいとおもっており,wsprintfとSetDlgItemTextをfor文でまわし,lpBufferの内容を
変化させたいのです.
ですので,wsprintf(lpBuffer,あいうえお\r\nかきくけこ)ですと,異常な長さになる
ためこのような書き方にしてしまいました.
上書きではなく追記のAPI関数は,あるのでしょうか?また,なんというのでしょうか?
試していませんが、カーソル位置を適切な場所へ移動させ、EM_REPLACESELを使って文字
列をカーソル位置へ挿入させることができるようです。
詳細はMSDNライブラリで調べてください。
> 30行くらいの配列に入った実験のデータを改行をして,表
> 示させいとおもっており
配列に入っているのなら、こんな感じにしては?
とりあえず、Data[]はNULL終端の文字列が格納されている場合
(1)
strcpy( lpBuffer, " );
for( i=0; i<MAX; i++ ){
strcat( lpBuffer, Data[i] );
strcat( lpBuffer, \r\n );
}
(2)
memset( lpBuffer, 0x00, LPBUFFER_SIZE );
for( i=0; i<MAX; i++ ){
wsprintf( lpBuffer, %s%s\r\n, lpBuffer, Data[i] );
}
#(2)の方は、少し自信なし。多分大丈夫だったと思う・・・
char *p;
for( p=lpBuffer, i=0; i<MAX; i++ )
{
p += wsprintf( p, %s\r\n, Data[i] );
}
の方がスマートかと。
> ですので,wsprintf(lpBuffer,あいうえお\r\nかきくけこ)ですと,異常な長さになる
> ためこのような書き方にしてしまいました.
いえ、結局エディットコントロールの中に入ってしまえば同じ事なので
気にする必要はないと思いますけれど。
内部では結局繋げて管理しているでしょうし。
データサイズがエディットコントロールの上限を超えてしまうようなら
元々分割して扱うように考えないといけない訳ですから
設定する時は繋げてしまって構わないと思いますよ。
動的にやりたいのであれば、
char* lpBuffer;
としておいて総文字数+改行用のコード分でmallocでも良いでしょうし。
最後にfreeするのさえ忘れなければ良いだけですし。
NowNowさん,KING・王さん,tibさん,PATIOさん
ありがとうございます.できました!!!
前のバッファ+追加のバッファという考えを知りませんでした.こういう考え方は,みな
さん自分で思いつくんですか?それとも,プログラミングする上では,定石なのでしょう
か?もし,定石ならば,参考になるWebサイト,書籍等をお教えいただけないでしょうか?
その昔よんだC言語の入門書にも動的にメモリを確保する方法に関する記述はあったと
思うので特別な方法ではないと思います。
固定サイズのバッファで確保できない場合は、ポインタで宣言しておいて
mallocやrealloc等を使ってメモリを確保し、使い終わったらfreeというのは、
C言語では基本なスタイルです。
確保したメモリは、memset等でクリアしておくのもバグを出にくくする方法の一つです。
一つ断っておきますが、データを設定する時は必ず必要なサイズ分のメモリ確保が必須です。
確保するメモリが足りないと不正アクセスを起こして危険です。
あと、文字列として取り扱うのであれば文字列終端を表す'\0'の分だけ1バイト余計に
メモリを確保する必要があるので注意が必要です。
補足
wsprintf( p, %s\r\n, Data[i] );で使っているpは、lpBufferで初期化されて
その後、wsprintfの返却値でインクリメントされていますが、
この場合、lpBufferは、(Dataに入っているデータの総バイト数 + (2 * MAX) + 1)分の
サイズが必要になります。(2 * MAX)は\r\nの行数分のサイズ。
そういう意味でいくと追加のバッファと言うのは表現がおかしいと思います。
wsprintfがメモリを確保してくれるわけではないので、lpBufferで確保している以上の
データを設定してしまうと不正アクセスになります。
これは絶対にやってはいけない行為なので気をつける必要があります。
不正アクセスをしていても偶々動いてしまうことがあります。
なので動いたからといって大丈夫と言うことにはなりません。