J#(Java)数字または一部の文字しか入力できないようにする

スポンサーリンク

テキストボックスで数字または一部の文字しか入力できないようにするには、System.Windows.Forms.TextBox を継承したカスタム コントロールを使う方法が最も手軽です。

KeyPress イベントなどで入力を規制しているサンプルを良く見かけますが、あれでは「貼り付け」の対応ができません。少なくとも、コンテキスト メニューからの [貼り付け] は、キーの入力から排除できるものではありません。これを防ぐために TextChanged イベントと併用しているサンプルもありますが、あれではチラツキが生じます。

どのデバイスで入力されようと、一元で排除できるような機構にした方が楽なのです。だからといって 入力チェックをしなくても良いわけではない です。そういう意味でも、「最終チェックに一任する」という選択肢があることも忘れないでください。

実装方法ですが、先に申し上げたように System.Windows.Forms.TextBox クラスを継承したカスタム コントロールを作ります。ここで、WM_CHAR (クライアント領域への入力) と WM_PASTE (貼り付け) を捕捉し、然るべき処理を行えば良いのです。WM_CHAR と WM_PASTE を捕捉するために、WndProc メソッドをオーバーライドしています。

然るべき処理は、WndProc メソッドで実装せず、わかりやすくするために、OnChar メソッドと OnPaste メソッドを経ています。文字列を許可するかどうかの実際の判定は HasPermitChars 静的メソッドと、GetPermitedString 静的メソッドで実装しています。

サンプルなので、わかりやすくベタに実装しようかと思いましたが、少し汎用性を持たせたかったので、PermitChars プロパティを設けました。ここに格納された System.Char の配列が許可された文字になり、ここに登録されていない文字の入力はできなくなります。

まずは、カスタム コントロールを実装してみましょう。

サンプルコード

以下にサンプルコードを示します。

J# 全般

J# では WndProc のオーバーライドができません。J#2005 では、@ref タグを使えばできるかもしれません。

関連するリファレンス

準備中です。

スポンサーリンク