|
■No93941 (Azulean さん) に返信 >> If (e.KeyCode = Keys.A Or Keys.B Or Keys.C Or Keys.D Or Keys.E Or Keys.F)で > この If 文は「e.KeyCode = Keys.A」「Keys.B」「Keys.C」「Keys.D」「Keys.E」「Keys.F」という区切りに対して Or で結合されている。 > なので、e.KeyCode の値をチェックしているのは「e.KeyCode = Keys.A」だけ。 > どんなキーでも OK となってしまうのは、「Keys.B」などが「True」と扱われるから。
上記の説明だと、ここの型変換が If (e.KeyCode = Keys.A) Or CBool(Keys.B) Or CBool(Keys.C) Or CBool(Keys.D) Or CBool(Keys.E) Or CBool(Keys.F) Then と解釈されているかのようにも読めてしまうので、少し補足。
この場合、実際の判定処理は If CBool(CInt(e.KeyCode = Keys.A) Or CInt(Keys.B) Or CInt(Keys.C) Or CInt(Keys.D) Or CInt(Keys.E) Or CInt(Keys.F)) Then に相当する形で行われることになります。
最初に = 演算子が判定されて Boolean 値になりますが、 「Boolean値 Or Keys列挙値」の演算結果は、Integer 値として扱われるためです。
Dim x = Keys.A Or Keys.B 'x は Keys 型になる Dim y = True Or Keys.B 'y は Integer 型になる Dim z = True OrElse Keys.B 'z は Boolean 型になる
そして Integer が Boolean に変換される場合、0 以外はすべて True 相当と解釈されます。 (Keys が Boolean に変換される場合は、Keys.None 以外すべて True 相当と解釈されます)
それゆえに yuji さんの If 文だと、e.KeyCode の値が Keys.A であろうとなかろうと、 If 判定がすべて True 扱いになってしまいますね。
> ■93936 (魔界の仮面弁士 さん)に返信 > NumericUpDown コントロールでマウスでのスクロール操作ができないようにする方法はありませんか?
スクロールというのは、ホイール操作のことでしょうか。 だとしたら、Increment を 0 にすれば、ホイール操作で値が変更されなくなりますよ。
もしも ▲▼ボタンは使えるようにしつつ、ホイール操作は無効化したい場合には、 NumericUpDown を継承して、OnMouseWheel メソッドの呼び出しを握りつぶすことで対処できます。
なお、ボタンその物を消す方法は用意されていません。 『NumericUpDown1.Controls(0).Hide()』などで無理矢理隠すことはできますが、 そこまで大きく変更する場合は、NumericUpDown 以外の方法を使った方が良いですね。
■No93933 (yuji さん) に返信 > フォームに用意したテキストボックスへの入力値を > 16進数の0〜9とa〜fのみ入力できるようにしたいのですが
A〜F なら良いですが、a〜f を求めるとなると、NumericUpDown では無理がありますね…。
また、「通信系のアプリ」で扱う値の範囲が、Byte や Integer 値などであるならば、 NumericUpDown が便利だと思いますが、「先頭 0 埋めの固定長データ」や 「ASCII 文字列」などのバイナリ表現のために用いる場合には不向きです。
何故なら NumericUpDown の性質上、最大値が Decimal.MaxValue までと定められているためです。 FFFFFFFFFFFFFFFFFFFFFFFF(10 進数で「79,228,162,514,264,337,593,543,950,335」)以下の値しか扱えません。 しかも Hexadecimal モードになれば、Int64.MaxValue にまで限定されるため、 7FFFFFFFFFFFFFFF(10 進数で「9,223,372,036,854,775,807」)以下に制限されます。
|