Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
  • ベストアンサー

テキストボックスの入力文字を16進数のみに制限する

VC++2005、.NET2.0、C++/CLIにてWindowsアプリを作成しています。 テキストボックスの入力文字について、 「00」~「FF」の16進数文字(半角)のみ入力可能としたいのですが、 どうやって制限をかければ良いのでしょうか? また、もし16進数のみの制限が不可能であれば、 半角英数字のみの制限でも良いと考えています。

質問者が選んだベストアンサー

  • ベストアンサー
  • reset_cat
  • ベストアンサー率68% (94/138)
回答No.2

せっかくなんで、私が思いついた方法を書いてみます。(未テスト) //フォームメンバ TextBox^ textBox1; String^ strOldText; //フォームコンストラクタ this->textBox1 = gcnew TextBox(); this->textBox1->ModifiedChanged += gcnew EventHandler(this, &Form1::textBox1_ModifiedChanged); strOldText = ""; //イベントハンドラ void textBox1_ModifiedChanged(Object^ sender, EventArgs^ e) { TextBox^ ctlText = dynamic_cast<TextBox^>(sender); if(ctlText != nullptr) { array<Char>^ aryCheck = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'A', 'B', 'C', 'D', 'E', 'F'}; int nIdx1 = ctlText->Text->Length - 1; while(nIdx1 >= 0) { int nIdx2 = aryCheck->Length - 1; while(nIdx2 >= 0) { if(ctlText->Text[nIdx1] == aryCheck[nIdx2]) { break; } nIdx2--; } if(nIdx2 < 0) { break; } nIdx1--; } if(nIdx1 >= 0) { ctlText->Text = strOldText; ctlText->Select(textBox1->Text->Length, 0); } else { strOldText = ctlText->Text; } ctlText->Modified = false; } }

zigen8513
質問者

お礼

御回答ありがとうございます。 試しましたところ、期待動作をさせることが出来ました。 ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • reset_cat
  • ベストアンサー率68% (94/138)
回答No.4

KeyPressイベント名をダブルクリックしてみましたか? もしくは以下のようなコードをコンストラクタに追加で。 textBox1->KeyPress += gcnew KeyPressEventHandler(this, &Form1::textBox1_KeyPress); テキストボックスのKeyPressイベントは、ShiftキーやCtrlキーの組み合わせはフックされますが、 Tabキーやカーソルキーはフックされないので、それらの判定はいらないと思います。

zigen8513
質問者

お礼

御回答ありがとうございます。 イベント名がプルダウンに表示されないので、 クリックできないのです。。 しかし、コンストラクタに提示頂いたコードを追加すると、 KeyPressイベントを取ることが出来ました。 ありがとうございました。

すると、全ての回答が全文表示されます。
回答No.3

 こんばんは。  当方が思い浮かぶのはKeyPressイベントで受け入れの是非を選択する、でしょうか。  e->Handled = true  とする事で拒絶が出来るので、此れを利用します。参考程度で。 private: System::Void textBox1_KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e) { //BS, TAB, CTLR+X, CTLR+C, CTLR+V, LEFT, RIGHT array<System::Char>^ ac = gcnew array<System::Char> { 0x8, 0x9, 0x3, 0x16, 0x18, 0x25, 0x24 }; for(int n = 0; n < ac->Length; ++n) if(e->KeyChar == ac[n]) return; if(this->textBox1->Text->Length < 2) { System::String^ mask = "0123456789abcdefABCDEF"; for(int n = 0; n < mask->Length; ++n) if(e->KeyChar == System::Char::Parse(mask[n].ToString())) return; } //受け入れ拒絶 e->Handled = true; }

zigen8513
質問者

補足

御回答ありがとうございます。 早速テキストボックスのイベントハンドラで、 KeyPressを選択し、ハンドラを作成しようとしたのですが、 プルダウンを開いても、ハンドラ関数が表示されず、 関数を作成することが出来ません。 他のハンドラはプルダウンに表示され、作成することが可能なのですが。。 何か他に手順が必要なのでしょうか?

すると、全ての回答が全文表示されます。
  • reset_cat
  • ベストアンサー率68% (94/138)
回答No.1

テキストボックスの「ModifiedChanged」イベントを登録し、 そこで「Text」プロパティをチェックする・・・というのはどうでしょう? その場合は、イベントハンドラで「Modified」プロパティを設定しなおす必要がありますが・・・

すると、全ての回答が全文表示されます。

関連するQ&A