ダイアログボックスのエディットボックスに
GetWindowText(GetDlgItem(hWnd, IDC_EDIT), get_txt, 3000);
wsprintf(txt, %s, Device xxx Error!);
wsprintf(set_txt, %s\r\n%s\n, get_txt, txt);
SetDlgItemText(hWnd, IDC_EDIT, set_txt);
という形で、ダイアログボックスの文字を取得 ⇒ 新しく入力したい文字をバッファ
に格納 ⇒ 取得した文字列の後に改行を入れて追加 ⇒ エディットボックスに再び
出力 としてエディットボックスに実験装置の状態をどんどん追記していくプログラム
を作成しております。
実験装置の設定項目が多いせいもあるのでしょうが、途中までいったところで(Wordで
数えると1000字程度)文章が途中で切れてそれ以上文章を追加できなくなってしまいま
す。
私としては、その先もどんどん文章を追加していく予定であったので、さらに文字を追
加していきたいのですが、これはエディットボックスの文字数の制限等があるのでしょ
うか?
もし、もっと多数の文字をエディットボックスに格納していく方法があればどなたか教
えていただけないでしょうか?
以上よろしくお願いいたします。
えっと、バッファサイズはいくつにしてますか?(上の例だと3000
マルチバイトで全角文字を入れているのであれば、
おそらくそのバッファサイズの半分以下の文字しか格納できないと思いますが、
そういう制限ではなくてですか?
そのコードは一度、全内容をバッファに読み出してから追加して書き戻ししてますか
ら、
この仮定のいずれかでサイズが溢れればそれ以上の追記はできません。
ReplaceSelの方でやってみてください。
> えっと、バッファサイズはいくつにしてますか?(上の例だと3000
えっと、バッファサイズはいくつにしてますか?(上の例だと3000?
SendMessage( hLogBox, EM_EXLIMITTEXT, 0, (LPARAM)1024*1024*5);
エディットボックス(hLogBox)のバッファサイズを5MBに拡張する例です。
みなさま回答ありがとうございます。
同時に返事が遅れて申し訳ありませんでした
>Banさま
上記のプログラムで言うところのget_txt、txt、set_txtのサイズをどれだけ拡大し、そ
してGetWindowTextのバッファサイズのところもどれだけ大きくしてももはや文字数は増
えませんでした。。。
TCHAR txt[10000], get_txt[10000], set_txt[10000];
GetWindowText(GetDlgItem(hWnd, IDC_EDIT), get_txt, 3000);
ともやったり、何度も値を変えたりしたのですが。。。
>シオナさま
SendMessage(IDC_EDIT, EM_EXLIMITTEXT, 0, (LPARAM)1024*1024*5);
でコンパイルしましたが、なぜか
'EX_EXLIMITTEXT':定義されていない識別子です
と出てしまいました。何か特別なincludeファイル等必要になってくるのでしょうか?
開発環境だけ入れて
PlatformSDKを追加で入れてない予感
…さま
すいません、無知で申し訳ないのですが、PlatformSDKが入っているかどうかはどのよう
にして確認できますか?
この入っているPCが私のではなく、学校のPCなのでインストール等は自分でやって
おらずわからないのです。
よろしくお願いします。
追記です。
開発環境はVC6.0を使っております。
> GetWindowText(GetDlgItem(hWnd, IDC_EDIT), get_txt, 3000);
とりあえず、バッファサイズに関係なく3000文字(改行等も込み)までしか読まない
指定ですが、数千文字に到達せずに切れているのですよね?
(ちなみに何行ありますか?3000から改行分を引いた文字数が読み出される指定です。
あと、書き込みの時点で既に後ろが切れている可能性はありませんか。
画面上などで確認できていますか。
また、GetWindowTextではなく、直接 WM_GETTEXT を使った場合どうなりますか。
EM_EXLIMITTEXT はEditではなくRichEditに対する指定なので、
Richedit.h がないとコンパイルは通らないでしょう。
# MSDN にちゃんと書いてあります。鵜呑みにせずに必ず自分で確認することを強くお勧
めします。
試すなら、EM_LIMITTEXTですね。使い方はMSDN参照。
Banさま
すばやいコメントありがとうございました。
>とりあえず、バッファサイズに関係なく3000文字(改行等も込み)までしか読まない
指定ですが、数千文字に到達せずに切れているのですよね?
(ちなみに何行ありますか?3000から改行分を引いた文字数が読み出される指定です。)
とりあえず、エディットボックスに限界まで出力させたあと、その文章をWordにはりつ
けたあと文字をカウントした結果
文字数:839
段落数:62
行数:124
という結果になりました。
また、画面上には同様の昨日を持たせたエディットボックスがもう一個あるのですが、
そちらでも同じことをやった結果
文字数:840
段落数:20
行数:40
という結果になりました。
ちなみにこれは、
GetWindowText(GetDlgItem(hWnd, IDC_EDIT), get_txt, 3000);
のサイズを10000等に変更しても同じでした。
>あと、書き込みの時点で既に後ろが切れている可能性はありませんか。
画面上などで確認できていますか。
エディットボックスに書きこんだ結果を見ると、文字が書ききれなくなった最後の部分
のみは制限のため文章が途中で途切れていますが、その前まではきちんと出力できてい
るので、ここで限界が来ており、それ以降はボタンを押しても一切書き込まれなくなっ
ています。
>また、GetWindowTextではなく、直接 WM_GETTEXT を使った場合どうなりますか。
使ってみたところ、同様の結果が得られました。
>EM_EXLIMITTEXT はEditではなくRichEditに対する指定なので、
Richedit.h がないとコンパイルは通らないでしょう。
# MSDN にちゃんと書いてあります。鵜呑みにせずに必ず自分で確認することを強くお勧
めします。
試すなら、EM_LIMITTEXTですね。使い方はMSDN参照。
指摘どおり、EM_LIMITTEXTを用いて
SendMessage((HWND)IDC_EDIT, EM_LIMITTEXT, 0, (LPARAM)1024*1024*5);
をメッセージループの中の case:WM_INITDIALOG のところで実行させてみましたが結
果は変わらずでした(文字数カウントの結果も一緒)
ん~これがエディットボックスの限界なんですかね。。。
> SendMessage((HWND)IDC_EDIT, EM_LIMITTEXT, 0, (LPARAM)1024*1024*5);
こちらで試せてなくて申し訳ありませんが、
仮に、ここでもっと小さな値を指定したらどうなりますか。
Windowsのバージョンが書かれてませんが、9x系などにこういう制限がありますので。
<MSDN>
Edit controls on Windows 95/98/Me:
If this parameter is zero, the text length is set to 0x7FFE characters for
single-line edit controls or 0xFFFF for multiline edit controls.
</MSDN>
MSDNは読まれているでしょうから、再確認でしかありませんが、
一応デフォルトはこうなってるはずなんですよね。
<MSDN>
Before EM_LIMITTEXT is called, the default limit for the amount of text a user
can enter in an edit control is 32,767 characters.
</MSDN>
<MSDN>
For edit controls and Microsoft® Rich Edit 1.0, bytes are used.
For Rich Edit 2.0 and later, characters are used.
</MSDN>
なので、全角文字だと更に半分(概算)の文字数かとは思いますが。
という説明を書いて気づきましたが、多分、
失敗してるのはwsprintfの方ではありませんか。
<MSDN>
関数が失敗すると、期待される出力の長さよりも小さい値が返ります。
拡張エラー情報を取得するには、GetLastError 関数を使います。
</MSDN>
この制限にちょうどかかりそうな数字だと思われます。
<MSDN>
1,024 バイトより大きなバッファを使うには、_snwprintf 関数を使ってください。
詳細については、C のランタイムライブラリのドキュメントを参照してください。
</MSDN>
ちゃんとエラーチェックしてないのではないですか?
使うAPIは必ず仕様をMSDNで確認し、エラーチェックをきっちり行うことを
強く推奨します。
SDKは
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/
をたどって
PSDK-x86.exe
をゲットしてはどうでしょうか
ただし学校のPCのようですから
PCの管理者に相談されてはいかがでしょうか
# VS2005EE等でなくVC6ですから(古いですが)PlatformSDKがデフォルトで入ってます
し、
# 今回の問題とは多分直接関係ないと思われます。
# (上に出てたコンパイルエラーは単に必要なヘッダを指定してないだけでしょうし)
# それでも更新したいのであれば、管理者にお願いすることになると思いますが、
# VC6はMSのサポートも切れたので、むやみに最新にするというのも…
皆様コメントありがとうございました。
Banさまのご指摘どおり_snwprintf関数を使うことで問題は解決しました。
ありがとうございました。