Tips 数値のみ入力に制限

 年齢や金額など、ユーザーからデータ入力をしてもらう時に、数値のみを取り扱いたいことがあります。ユーザーが誤って文字や記号を入力してしまうことのないよう、プログラムでチェックしなければなりません。
 入力された値が数値かどうかをチェックする方法として、次の3通りが考えられます。
  • 1.IMEを「IMEオフ」に設定する。
  • 2.「数字か判定」「数列か判定」命令を使う。
  • 3.WinAPIを使う。

1.IMEを設定する。

 エディタにフォーカスが移動した時、IMEの設定を「IMEオフ」に切り替えるようにします。これでユーザーが誤って日本語などの2バイト文字を入力してしまうことは避けられます。
 しかし、これだけではアルファベットや記号なども入力できてしまいますので、対策として十分とは言えません。
 ユーザーに注意を促す程度の効果があるものの、いいアイデアとは言えませんね。

2.判定する。

 入力された値を判定して、もしも数値以外の値が含まれていれば、ユーザーに再度入力を促します。

'***** サンプル *****
「年齢を入力してください」と表示。
年齢エディタとはエディタ
年齢エディタの変更した時
  もし(年齢エディタが数列か判定)でなければ
    「数値しか入力できません!」と言う。
'***** ここまで *****

 この方法が一般的だと思われます。エラー警告を出すだけでなく、エディタの内容をクリアしたり、正しい数値を予測して訂正したり、様々な対処方法をとることができます。

3.APIを使う。

 WinAPIを使って、エディタ>GUI/エディタ]]に数値以外の入力を受け付けないようにします。
 エディタ>GUI/エディタ]]のGWL_STYLEにES_NUMBERを設定することにより、入力を数値のみに制限します。
 この設定により、ユーザーは「0」から「9」の数字しか入力することができなくなります。カンマ「,」や小数点「.」、符号「+/-」も入力できません。

'***** サンプル *****
'定数設定
GWL_STYLE=-16
ES_NUMBER=$2000
'部品作成
エディタAとはエディタ
HndAはエディタAのハンドル。 'エディタ部品のウィンドウハンドル取得
Styleとは整数。
Style=GetWindowLong(HndA,GWL_STYLE) '現在の書式を取得
Style=OR(Style,ES_NUMBER) '書式部分を変更
SetWindowLong(HndA,GWL_STYLE,Style) '新たな書式を設定
'API宣言
●GetWindowLong(hWnd,nIndex) =DLL("user32.dll",
"LONG GetWindowLongA(
HWND hWnd, // ウィンドウハンドル
int nIndex // 取得するデータの指定
)")
●SetWindowLong(hWnd,nIndex,dwNewLong) =DLL("user32.dll",
"LONG SetWindowLongA(
HWND hWnd, // ウィンドウハンドル
int nIndex, // 変更するデータの指定
LONG dwNewLong // 新しい値
)")
'***** ここまで *****

 GetWindowLongでエディタ>GUI/エディタ]]の現在の状態を変数Styleに取得します。Styleの書式部分をES_NUMBERに書き換えて、SetWindowLongでエディタに新しい状態(Style)を設定します。

 上記プログラムの「定数設定」部分と「API宣言」部分は、なでしこライブラリの「windows.nako」に定義されていますので、次のように取り込むことで、わざわざ定義しなくても済みます。

'***** サンプル *****
!「windows.nako」を取り込む。
'部品作成
エディタAとはエディタ。
HndAはエディタAのハンドル。 'エディタ部品のウィンドウハンドル取得
Styleとは整数。
Style=GetWindowLong(HndA,GWL_STYLE) '現在の書式を取得
Style=OR(Style,ES_NUMBER) '書式部分を変更
SetWindowLong(HndA,GWL_STYLE,Style) '新たな書式を設定
'***** ここまで *****

コメント

名前:
コメント:
最終更新:2008年10月28日 11:29