エディットボックスの改行について – プログラミング – Home

エディットボックスの改行について
 
通知
すべてクリア

[解決済] エディットボックスの改行について


K
 K
(@K)
ゲスト
結合: 23年前
投稿: 98
Topic starter  

たびたびお世話になります.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→表示させたいエディットボックス

ここで,エディット内に

 あいうえお
 かきくけこ

と改行させて表示させたいのですが,『あいうえお』が更新されて

 かきくけこ

だけの表示になってしまいます.

どなたか,改行の仕方をお教えてください.おねがいします.


引用未解決
トピックタグ
REE
 REE
(@REE)
ゲスト
結合: 24年前
投稿: 240
 

wsprintf(lpBuffer,あいうえお\r\nかきくけこ);
SetDlgItemText( hWnd, IDC_EDIT1, lpBuffer);

※ SetDlgItemTextは追記ではなく上書きです。


返信引用
k
 k
(@k)
ゲスト
結合: 23年前
投稿: 98
 

REEさんありがとうございます.

説明が足らなかったのですが,30行くらいの配列に入った実験のデータを改行をして,表
示させいとおもっており,wsprintfとSetDlgItemTextをfor文でまわし,lpBufferの内容を
変化させたいのです.
ですので,wsprintf(lpBuffer,あいうえお\r\nかきくけこ)ですと,異常な長さになる
ためこのような書き方にしてしまいました.

上書きではなく追記のAPI関数は,あるのでしょうか?また,なんというのでしょうか?


返信引用
NowNow
 NowNow
(@NowNow)
ゲスト
結合: 20年前
投稿: 27
 

試していませんが、カーソル位置を適切な場所へ移動させ、EM_REPLACESELを使って文字
列をカーソル位置へ挿入させることができるようです。
詳細はMSDNライブラリで調べてください。


返信引用
KING・王
 KING・王
(@KING・王)
ゲスト
結合: 21年前
投稿: 122
 

> 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)の方は、少し自信なし。多分大丈夫だったと思う・・・


返信引用
tib
 tib
(@tib)
ゲスト
結合: 23年前
投稿: 468
 

char *p;
for( p=lpBuffer, i=0; i<MAX; i++ )
{
  p += wsprintf( p, %s\r\n, Data[i] );
}

の方がスマートかと。


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

> ですので,wsprintf(lpBuffer,あいうえお\r\nかきくけこ)ですと,異常な長さになる
> ためこのような書き方にしてしまいました.

いえ、結局エディットコントロールの中に入ってしまえば同じ事なので
気にする必要はないと思いますけれど。
内部では結局繋げて管理しているでしょうし。
データサイズがエディットコントロールの上限を超えてしまうようなら
元々分割して扱うように考えないといけない訳ですから
設定する時は繋げてしまって構わないと思いますよ。


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

動的にやりたいのであれば、
char* lpBuffer;
としておいて総文字数+改行用のコード分でmallocでも良いでしょうし。
最後にfreeするのさえ忘れなければ良いだけですし。


返信引用
k
 k
(@k)
ゲスト
結合: 23年前
投稿: 98
 

NowNowさん,KING・王さん,tibさん,PATIOさん

ありがとうございます.できました!!!

前のバッファ+追加のバッファという考えを知りませんでした.こういう考え方は,みな
さん自分で思いつくんですか?それとも,プログラミングする上では,定石なのでしょう
か?もし,定石ならば,参考になるWebサイト,書籍等をお教えいただけないでしょうか?


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

その昔よんだC言語の入門書にも動的にメモリを確保する方法に関する記述はあったと
思うので特別な方法ではないと思います。

固定サイズのバッファで確保できない場合は、ポインタで宣言しておいて
mallocやrealloc等を使ってメモリを確保し、使い終わったらfreeというのは、
C言語では基本なスタイルです。
確保したメモリは、memset等でクリアしておくのもバグを出にくくする方法の一つです。

一つ断っておきますが、データを設定する時は必ず必要なサイズ分のメモリ確保が必須です。
確保するメモリが足りないと不正アクセスを起こして危険です。
あと、文字列として取り扱うのであれば文字列終端を表す'\0'の分だけ1バイト余計に
メモリを確保する必要があるので注意が必要です。


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

補足

wsprintf( p, %s\r\n, Data[i] );で使っているpは、lpBufferで初期化されて
その後、wsprintfの返却値でインクリメントされていますが、
この場合、lpBufferは、(Dataに入っているデータの総バイト数 + (2 * MAX) + 1)分の
サイズが必要になります。(2 * MAX)は\r\nの行数分のサイズ。
そういう意味でいくと追加のバッファと言うのは表現がおかしいと思います。
wsprintfがメモリを確保してくれるわけではないので、lpBufferで確保している以上の
データを設定してしまうと不正アクセスになります。
これは絶対にやってはいけない行為なので気をつける必要があります。

不正アクセスをしていても偶々動いてしまうことがあります。
なので動いたからといって大丈夫と言うことにはなりません。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました