プロが教える店舗&オフィスのセキュリティ対策術

VC++2005、.NET2.0、C++/CLIにてWindowsアプリを作成しています。

テキストボックスの入力文字について、
「00」~「FF」の16進数文字(半角)のみ入力可能としたいのですが、
どうやって制限をかければ良いのでしょうか?

また、もし16進数のみの制限が不可能であれば、
半角英数字のみの制限でも良いと考えています。

A 回答 (4件)

せっかくなんで、私が思いついた方法を書いてみます。

(未テスト)

//フォームメンバ
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;
}
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/11/26 14:10

KeyPressイベント名をダブルクリックしてみましたか?


もしくは以下のようなコードをコンストラクタに追加で。

textBox1->KeyPress += gcnew KeyPressEventHandler(this, &Form1::textBox1_KeyPress);

テキストボックスのKeyPressイベントは、ShiftキーやCtrlキーの組み合わせはフックされますが、
Tabキーやカーソルキーはフックされないので、それらの判定はいらないと思います。
    • good
    • 0
この回答へのお礼

御回答ありがとうございます。
イベント名がプルダウンに表示されないので、
クリックできないのです。。

しかし、コンストラクタに提示頂いたコードを追加すると、
KeyPressイベントを取ることが出来ました。
ありがとうございました。

お礼日時:2009/11/30 11:27

 こんばんは。



 当方が思い浮かぶのは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;
}

この回答への補足

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

補足日時:2009/11/26 13:40
    • good
    • 0

テキストボックスの「ModifiedChanged」イベントを登録し、


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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています