エディットボックスの文字制限 – プログラミング – Home

エディットボックスの文字制限
 
通知
すべてクリア

[解決済] エディットボックスの文字制限


シュン
 シュン
(@シュン)
ゲスト
結合: 22年前
投稿: 22
Topic starter  

ダイアログボックスのエディットボックスに
  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字程度)文章が途中で切れてそれ以上文章を追加できなくなってしまいま
す。
私としては、その先もどんどん文章を追加していく予定であったので、さらに文字を追
加していきたいのですが、これはエディットボックスの文字数の制限等があるのでしょ
うか?

もし、もっと多数の文字をエディットボックスに格納していく方法があればどなたか教
えていただけないでしょうか?
以上よろしくお願いいたします。


引用未解決
トピックタグ
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

えっと、バッファサイズはいくつにしてますか?(上の例だと3000
マルチバイトで全角文字を入れているのであれば、
おそらくそのバッファサイズの半分以下の文字しか格納できないと思いますが、
そういう制限ではなくてですか?

そのコードは一度、全内容をバッファに読み出してから追加して書き戻ししてますか
ら、
この仮定のいずれかでサイズが溢れればそれ以上の追記はできません。

ReplaceSelの方でやってみてください。


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

> えっと、バッファサイズはいくつにしてますか?(上の例だと3000
えっと、バッファサイズはいくつにしてますか?(上の例だと3000?


返信引用
シオナ
 シオナ
(@シオナ)
ゲスト
結合: 18年前
投稿: 1
 

SendMessage( hLogBox, EM_EXLIMITTEXT, 0, (LPARAM)1024*1024*5);

エディットボックス(hLogBox)のバッファサイズを5MBに拡張する例です。


返信引用
シュン
 シュン
(@シュン)
ゲスト
結合: 22年前
投稿: 22
Topic starter  

みなさま回答ありがとうございます。
同時に返事が遅れて申し訳ありませんでした

>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ファイル等必要になってくるのでしょうか?


返信引用
…
 …
(@…)
ゲスト
結合: 22年前
投稿: 113
 

開発環境だけ入れて
PlatformSDKを追加で入れてない予感


返信引用
シュン
 シュン
(@シュン)
ゲスト
結合: 22年前
投稿: 22
Topic starter  

…さま

すいません、無知で申し訳ないのですが、PlatformSDKが入っているかどうかはどのよう
にして確認できますか?
この入っているPCが私のではなく、学校のPCなのでインストール等は自分でやって
おらずわからないのです。

よろしくお願いします。


返信引用
シュン
 シュン
(@シュン)
ゲスト
結合: 22年前
投稿: 22
Topic starter  

追記です。
開発環境はVC6.0を使っております。


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

> GetWindowText(GetDlgItem(hWnd, IDC_EDIT), get_txt, 3000);

とりあえず、バッファサイズに関係なく3000文字(改行等も込み)までしか読まない
指定ですが、数千文字に到達せずに切れているのですよね?
(ちなみに何行ありますか?3000から改行分を引いた文字数が読み出される指定です。

あと、書き込みの時点で既に後ろが切れている可能性はありませんか。
画面上などで確認できていますか。

また、GetWindowTextではなく、直接 WM_GETTEXT を使った場合どうなりますか。

EM_EXLIMITTEXT はEditではなくRichEditに対する指定なので、
Richedit.h がないとコンパイルは通らないでしょう。
# MSDN にちゃんと書いてあります。鵜呑みにせずに必ず自分で確認することを強くお勧
めします。
試すなら、EM_LIMITTEXTですね。使い方はMSDN参照。


返信引用
シュン
 シュン
(@シュン)
ゲスト
結合: 22年前
投稿: 22
Topic starter  

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 のところで実行させてみましたが結
果は変わらずでした(文字数カウントの結果も一緒)

ん~これがエディットボックスの限界なんですかね。。。


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

>   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>
なので、全角文字だと更に半分(概算)の文字数かとは思いますが。


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

という説明を書いて気づきましたが、多分、
失敗してるのはwsprintfの方ではありませんか。

<MSDN>
関数が失敗すると、期待される出力の長さよりも小さい値が返ります。
拡張エラー情報を取得するには、GetLastError 関数を使います。
</MSDN>

この制限にちょうどかかりそうな数字だと思われます。

<MSDN>
1,024 バイトより大きなバッファを使うには、_snwprintf 関数を使ってください。
詳細については、C のランタイムライブラリのドキュメントを参照してください。
</MSDN>

ちゃんとエラーチェックしてないのではないですか?
使うAPIは必ず仕様をMSDNで確認し、エラーチェックをきっちり行うことを
強く推奨します。


返信引用
aharen
 aharen
(@aharen)
ゲスト
結合: 18年前
投稿: 25
 

SDKは
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/
をたどって
PSDK-x86.exe
をゲットしてはどうでしょうか
ただし学校のPCのようですから
PCの管理者に相談されてはいかがでしょうか


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

# VS2005EE等でなくVC6ですから(古いですが)PlatformSDKがデフォルトで入ってます
し、
# 今回の問題とは多分直接関係ないと思われます。
# (上に出てたコンパイルエラーは単に必要なヘッダを指定してないだけでしょうし)

# それでも更新したいのであれば、管理者にお願いすることになると思いますが、
# VC6はMSのサポートも切れたので、むやみに最新にするというのも…


返信引用
シュン
 シュン
(@シュン)
ゲスト
結合: 22年前
投稿: 22
Topic starter  

皆様コメントありがとうございました。

Banさまのご指摘どおり_snwprintf関数を使うことで問題は解決しました。
ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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