テキストボックスへの入力値制限

[戻る]
熱男 2017/02/06(月) 21:19:08
テキストボックスに入力する値を制限したいと思っています。
数字と小数点のみとし、数字の入力範囲は0から9.99までとしたいと思っています。
数字と小数点は以下のようにしようと思いますが、数値の入力範囲をどのようにすればよいか
ご教示のほどお願いします。
環境は、vc++2010 expressになります。 

private: System::Void textBox1_KeyPress(System::Object^ sender, 
System::Windows::Forms::KeyPressEventArgs^ e)
{
    if( e->KeyChar == '.' ){
        // 既に小数点が入力済みの場合
           if(textBox1->Text->Contains(".")){
               e->Handled = true; 
           }  
     // 数値のキー以外の場合
    }else if( e->KeyChar < '0' || e->KeyChar > '9' ){
         e->Handled = true;
       // その他の場合、すなわち、1回のみの小数点か数値の場合
    }else{
          e->Handled = false;
    }
}

瀬戸っぷ [E-Mail] 2017/02/07(火) 09:58:39
C++/CLIは判りませんけども……。
KeyPressイベントだけで処理は出来ないものと思われます。

TextChangedイベントでdouble.Parse()する…とか。
この場合だと変更後のテキストになるので変更前の内容を記憶しておく必要がありますが。
# TextBoxを継承したクラス作った方がいいでしょうけどね。
# double.Parse()で例外吐かれる可能性があることを考慮するとdouble.TryParse()の方
がいいかも知れませんけどね。

KeyPressイベント内で抑えるとしたら…
受入れた文字によってTextBoxの文字列が変化する内容を編集し、double.Parse()して範
囲判定…でしょうかね。
キャレットの位置や範囲選択されている場合に編集後の文字列を作るのがちょっと面倒で
すけど。

ITO 2017/02/07(火) 11:58:56
昔、やったことです。

1.エディットを文字列入力にする。
2.データ更新ボタンを設けて、値を入力入力したら押してもらうようにする。
3.データ更新ボタンが押されたら、文字列をチェックして範囲外であればエラー
 のメッセージを表示する。
4.よければ、文字列→数値変換をして次の処理へ進む。

ですね。
KEY-EVENTは、手違いが多くかなりややこしいですね。

瀬戸っぷ [E-Mail] 2017/02/07(火) 13:12:54
クリップボードから貼り付けされる場合もある。
ということも考慮が必要かも知れません。

ということで、C#でしたが…私は以下のページのコントロールを継承させて処理しています。
http://jeanne.wankuma.com/tips/csharp/textbox/permitchars.html
ここから「数字専用TextBox」「16進数文字専用TextBox」を派生させてます。
# 最大値/最小値判定も入れましたけど、フォーカス失う時(Validatingイベント)に判定
しているのであまり役に立たなかった。

クラス内のフィールド(いわゆるメンバ変数)に「正常だった時の値」を入れておくと
入力を蹴った時に無理矢理戻せる。というのもあったりはする。

熱男 2017/02/11(土) 22:22:11
[[解決]]
瀬戸っぷさん、ITOさんありがとうございます。

キーイベントで色々と検討して行いましたが・・・できませんでした。
瀬戸っぷさんのカスタムコントロールは、今後の学習として、
今回は、ITOさんが昔やった方法としました。
テキストボックスに入力後、次の操作イベントで文字列を確認して範囲外で
あればポップアップで警告を出すようにしました。


ありがとうございました。

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