- PR -

TextBoxに入力規制をかけるには?

投稿者投稿内容
しましま
常連さん
会議室デビュー日: 2005/01/08
投稿数: 41
投稿日時: 2005-07-30 14:12
久々にMSのサイトへ行ったら、Visual C#.NETのベータ版が無料配布されているのを発見したので、さっそくダウンロードして、練習のため簡単なWindowsアプリを作って見ているところですが、つまづきました;;

練習用の簡単なアプリということで、2つのTextBoxに数値を入力してから、Buttonを押すと、3つ目のTextBoxに足し算された答えを表示するというものです。

このとき、TextBoxに数値以外の文字が入力されると困るので、int型として解釈できる文字のみ入力可能にしたいのですがどうすればいいでしょうか?

今、TextBoxのサブクラスを作り、ProcessKeyEventArgs()をオーバーライドして、そのような処理を追加する方向で考えていますが、いまいちしっくりきません。
できれば、キーが押された直後より、テキストフィールドが更新される直前に処理を追加したいところです。

何かいい方法があれば教えてください。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-07-30 14:35
 Validating イベント、TextChanged イベントで、入力文字を正規表現でチェックします。

 キー入力で考えると、コピー&ペーストされたときが漏れる可能性があります。
_________________
しましま
常連さん
会議室デビュー日: 2005/01/08
投稿数: 41
投稿日時: 2005-07-30 15:48
Jittaさん、さっそくの返答ありがとうございます。

Validating イベントを使った場合は、入力の規制というよりは、入力はできるが間違った文字を入力すると次に進めなくなる、という仕様になると思いますがそういう事でしょうか?

TextChanged イベントを使った場合は、入力された文字列をチェックして、間違っていれば元の状態に書き戻すということでしょうか?

入力された文字をリアルタイムに検証して、間違っていれば文字が入力されない(まるでキー入力が無視されたような)仕様を想定していましたが、Validating イベントを使った仕様にする方がWindowsらしくていいのでしょうかねぇ〜?

入力チェックについてですが、今回はint型ということで、
2147483647 -- OK
9999999999 -- NG
となりますが、これって正規表現だとチェックしづらくないでしょうか?
チェックについては、単純にint.parse()で例外が発生するかどうかでやろうと思っていますが、これだと問題あるでしょうか?

あと、コピー&ペーストのケースは考えてませんでした。たしかに、これを考えるとProcessKeyEventArgs()をオーバーライドする方法は、ますます良くないですね。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-07-30 16:24
こんにちは、じゃんぬ です。

その場で制限するならば、WndProc をオーバーライドして、
WM_CHAR を捕捉して文字を制限します。
ペーストについては、WM_PASTE を補足して、
その時にクリップボードの内容を参照し、
入力可能な文字のみを手動で貼り付けます。



_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-07-30 18:32
しづらいと言われるとむきになるにしざきです。
コード:

^(?:-?0*(?:1\d{9}|20\d{8}|21[0-3]\d{7}|214[0-6]\d{6}|2147[0-3]\d{5}|21474[0-7]\d{4}|214748[0-2]\d{3}|2147483[0-5]\d{2}|21474836[0-3]\d|214748364[0-7]|[1-9][0-9]{0,8})|-2147483648|-?0)$



[ メッセージ編集済み 編集者: にしざき 編集日時 2005-07-30 18:32 ]

複数の 0 が抜けていたかもしれない。
最後の 0 を 0+ にするか、-?0を削除して0*に続く選択肢に0を入れるかかな。

[ メッセージ編集済み 編集者: にしざき 編集日時 2005-07-31 08:43 ]
しましま
常連さん
会議室デビュー日: 2005/01/08
投稿数: 41
投稿日時: 2005-07-31 16:19
じゃんぬさん、返答ありがとうございます。

WndProc()といえば、Win32APIに対応するローレベルなメソッドでしたっけ?
とにかく試してみたら、当初予定していた仕様のものが出来上がりました^^
それにしても、練習用の簡単なアプリのつもりが、あまり簡単じゃないアプリになったような気が。。。

ところで、WM_CHARやWM_PASTEなどの定数は、.NETではどこで定義されているのでしょうか?
コンパイルしたらエラーが出たので、とりあえずPlatform SDKをダウンロードしてきて、WinUser.hを見ながら自分で定義してみましたが。

あと、今回のような「数値しか入力してほしくないテキストフィールド」って、必要となるケースがよくあると思うのですが、そのようなアプリケーションってWindowsでは一般的にはどうゆう形で実装するのでしょうか?
やはり最初に話に出てきたように、Validating イベントなんかを使うのでしょうか?
.NETでも、なんらかの形でそうゆうケースをサポートしてるんじゃないかと思っているのですが。


#にしざきさん、凄いです。(拍手)
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-07-31 16:50
引用:

ところで、WM_CHARやWM_PASTEなどの定数は、.NETではどこで定義されているのでしょうか?
コンパイルしたらエラーが出たので、とりあえずPlatform SDKをダウンロードしてきて、WinUser.hを見ながら自分で定義してみましたが。


私も皆さんもそうしています。(^^)

引用:

あと、今回のような「数値しか入力してほしくないテキストフィールド」って、必要となるケースがよくあると思うのですが、そのようなアプリケーションってWindowsでは一般的にはどうゆう形で実装するのでしょうか?
やはり最初に話に出てきたように、Validating イベントなんかを使うのでしょうか?


通常は Validating などの検証イベント内でやりますね。
その方が楽ですし。

引用:

.NETでも、なんらかの形でそうゆうケースをサポートしてるんじゃないかと思っているのですが。


InputMan のようなものを使うとか、今回実装したものをカスタム コントロール化するとか。



_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
しましま
常連さん
会議室デビュー日: 2005/01/08
投稿数: 41
投稿日時: 2005-08-01 20:23
そうですかぁ。定義ファイルは無いんですかぁ。
用意しておいてくれてもいいと思うのだが。

そういえば、VistaになるとWin32APIがなくなるんでしたっけ?
もしかすると、WndProc()やWM_CHARなど、Win32APIに依存するようなコードが書く事自体がよくないのかもしれませんね。

とにかく、.NETの第一歩は無事に踏み出せた感じで、みなさまいろいろありがとうございました。

スキルアップ/キャリアアップ(JOB@IT)