エディットボックスから入力された変数のエラー処理

[戻る]
card 2002/11/08(金) 00:46:43
ダイアログベースでエディットボックスからdouble型の変数に代入しています。
この際、数字以外(文字や記号など)が入力されると、エラーのダイアログが表示されますが、
その後、自分でその処理をしないといけないと思います。

C言語などで、直接キーボードから入力する際は、gets()やsscanf()を組み合わせてエラー処理
するのは分かるのですが、VC++でエディットボックスから取得したものにたいしてはどうすれ
ばいいのか分かりません(バッファにも入っていないし)。なにか、アドバイスいただけないで
しょうか。

VCプログラミング以前の内容かもしれませんが、よろしくお願いします。

MFC使用 VC6 WIN2000

あば 2002/11/08(金) 03:16:50
 エディットボックスの数字チェックをはずし入力が確定した時点で自分でチェック処理を入れ
る。これならエディットボックスからの文字列は取得出来るのですよね。

> C言語などで、直接キーボードから入力する際は、gets()やsscanf()を組み合わせてエラー
> 処理するのは分かるのですが、VC++でエディットボックスから取得したものにたいしてはど
> うすれ

が分かっているのですからチェック部分はお分かりなのですよね。

くたくた 2002/11/08(金) 10:31:16
最も簡単なのは あばさん の仰る方法です。

もう少し便利にしようとお考えなら、1文字入力毎に正当性の検査をすれば
そのソフトを使う側にとってより助かります。(入力ミスの早期発見、早期訂正)

この場合、CEditの派生クラスを作り各WMハンドラで目的の処理をするようにします。
で、この派生クラスをDDX変数のCEditと置換すればいいです。

私の場合、こういうエディットボックスはいろんなソフトで多用する為、DLL化しています。

あば 2002/11/08(金) 10:35:13
いけね。自分も客に入力チェック直すように言われてたの忘れてた!

card 2002/11/08(金) 11:32:02
あばさん、くたくたさんありがとうございます。

> エディットボックスの数字チェックをはずし入力が確定した時点で自分でチェック
> 処理を入れる。これならエディットボックスからの文字列は取得出来るのですよね。

これは、UpdateData(TRUE)で、DDXで指定したメンバ変数に代入する前にチェックを行うとい
うことなのでしょうか(メンバ変数もCString型? 今のままでは、「a」などと入力されても
double型のメンバ変数には代入されません)。それとも、数字のチェックをはずすというのは、
DDV機能での範囲指定をしない、もしくはたんに、スタイルで番号のチェックを入れない(今
は、少数点を入れたいのでチェックしていませんが)ということでしょうか。

> が分かっているのですからチェック部分はお分かりなのですよね。

今までは、自分でしか使わないプログラムしか作ってこなかったので(今回もそれに近いものが
ありますが)、エラー処理についてはあまりやっていませんでした。私が使ってきたのは、上記
の通り、
char buf[20];
double i;
gets(buf);
sscanf(buf,"%f",&i);
のようにして、sscanfの戻り値でエラー判定ぐらいしかありません。あるいは、scanfで読み込
んで、getsで読み捨てる程度のことしかやったことがありません。
今回も単純に、エディットボックスに入力された値を直接bufに入れられたりできないかなどと
考えてしまっています(これが、甘いのだとは思うのですが)。

あばさんや、くたくたさんのおっしゃりたい意図が自分には分かっていないと思うので、もう少
し詳しく教えていただけないでしょうか。

くたくたさんの一文字ずつの判定に関しては自分もそう出来ればと思っています。調べてやって
みようと思います。

tib 2002/11/08(金) 11:40:31
CWnd::GetWindowText()もしくは
CWnd::GetDlgItemText()は使えますか?

これらがgets()の代わりに使えると思います。

あば 2002/11/08(金) 12:00:36
 エディットボックスに数値以外を入力した時にエラーチェックに引っかかったという事ですの
でダイアログベースのアプリケーションは出来上がっている物としてお話しします。

 MFCでいいますとリソースエディタでそのエディットボックスのプロパティを見れば[数値]
というチェックボックスがあると思いますがそのチェックをはずして下さい。これでなんでもお
かまいなしに入力出来るようになると思います。

 後はClassWizardでそのエディットボックスにメンバー変数を割り当てて下さい。今回ですと
タイプはCStringですね。

 後は
http://www.microsoft.com/japan/msdn/library/ja/vclib/html/_mfc_cwnd.3a3a.updated
ata.asp

こちらを参照ください。

あば 2002/11/08(金) 12:04:35
後はが多かった。m(__)m

リンク切れ訂正
http://www.microsoft.com/japan/msdn/library/ja/vclib/html/_mfc_cwnd.3a3a.updated
ata.asp

あば 2002/11/08(金) 12:10:08
ちゃんと読んでなかった。すみません。
ですね。ほとんどやってるんですね。

 違いはCStringで受けなければならないということだけです。あとはご自由に文字列処理でチ
ェック処理を作って下さい。

ゴミレスでした。m(__)m

card 2002/11/08(金) 14:12:16
[[解決]]
tibさん、あばさん、くたくたさんありがとうございます。

GetDlgItemText()を使うことで、解決できました。
みなさんの、親切な回答に感謝します。ありがとうございました。

古いスレッドには追加発言できません。