- PR -

KeyPressイベントの判定

投稿者投稿内容
ZingBay
常連さん
会議室デビュー日: 2004/02/16
投稿数: 27
お住まい・勤務地: 古の奈良
投稿日時: 2004-02-16 14:27
こんにちは。
VB+Oracleにて業務アプリを開発しております。
汎用機のレガシーシステムの操作性をエミュレーションする為に
数値項目や、文字項目、日本語項目等の、入力可能な文字属性を
制限したテキストボックスを作成したいと考えております。

VB6.0までは、以下のコードでキーボードイベントを握りつぶして
対応しておりました。

Private Sub Suryo_KeyPress(KeyAscii As Integer)

Select Case KeyAscii
Case 44
Case 46
Case vbKey0 To vbKey9
Case vbKeyBack
Case vbKeyReturn
'------------
入力完了と見なし、チェック処理を実施
'------------
Case Else
KeyAscii = 0
End Select
End Sub
で、コード量を減らす為に、以下の作戦に出てみました。
----------以下、.NETのコード-------------------
Public Class Form1
Inherits System.Windows.Forms.Form
Private numKeyPressHandler As New numberTextBox



#Region " Windows フォーム デザイナで生成されたコード "

Public Sub New()
MyBase.New()

' この呼び出しは Windows フォーム デザイナで必要です。
InitializeComponent()

' InitializeComponent() 呼び出しの後に初期化を追加します。
AddHandler TextBox1.KeyPress, AddressOf numKeyPressHandler.NumberTextBox_KeyPress
以下続く・・・・

で、握りつぶし用のクラスを作成
Public Class numberTextBox
' Private textBox1 As TextBox

Public Sub NumberTextBox_KeyPress(ByVal sender As Object, ByVal ex As KeyPressEventArgs)
Select Case ex.KeyChar
Case Convert.ToChar(System.Windows.Forms.Keys.A) To Convert.ToChar(System.Windows.Forms.Keys.Z)
ex.Handled = True
Case Convert.ToChar(System.Windows.Forms.Keys.Clear)
ex.Handled = False
Case Convert.ToChar(System.Windows.Forms.Keys.Return)
ex.Handled = False
Case Microsoft.VisualBasic.ChrW(System.Windows.Forms.Keys.D0) To Microsoft.VisualBasic.ChrW(System.Windows.Forms.Keys.D9)
ex.Handled = False
Case Microsoft.VisualBasic.ChrW(System.Windows.Forms.Keys.NumPad0) To Microsoft.VisualBasic.ChrW(System.Windows.Forms.Keys.NumPad9)
ex.Handled = False
Case Convert.ToChar(System.Windows.Forms.Keys.End)
ex.Handled = False
Case Convert.ToChar(System.Windows.Forms.Keys.Home)
ex.Handled = False
Case Convert.ToChar(System.Windows.Forms.Keys.Back)
ex.Handled = False
Case Convert.ToChar(System.Windows.Forms.Keys.Left)
ex.Handled = False
Case Convert.ToChar(System.Windows.Forms.Keys.Right)
ex.Handled = False
Case Convert.ToChar(System.Windows.Forms.Keys.Insert)
ex.Handled = False
Case Convert.ToChar(System.Windows.Forms.Keys.Delete)
ex.Handled = False
Case Convert.ToChar(System.Windows.Forms.Keys.Decimal)
ex.Handled = False
Case Else
ex.Handled = True
End Select
End Sub
End Class

で処理したところ、キーボードの "l(エル)"等は握りつぶせるのですが
"a"が通過してししまいます。

KEYハンドリングのやり方が根本的に違うのでしょうか?

識者の方、ご教授をお願いします。


Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-02-17 06:53
諸農です。

引用:

で処理したところ、キーボードの "l(エル)"等は握りつぶせるのですが
"a"が通過してししまいます。



デバッグしてみればわかるかと思いますが、
a=97
A=65
Keys.A=65
なので、通過します。


_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
ZingBay
常連さん
会議室デビュー日: 2004/02/16
投稿数: 27
お住まい・勤務地: 古の奈良
投稿日時: 2004-02-17 09:17
Jubei様
レス有難うございます。

言葉が足りなかったようで。

System.Windows.Forms.Keys.A
(snip)
System.Windows.Forms.Keys.Z
はマニュアルに記載されているのですが、
System.Windows.Forms.Keys.a

System.Windows.Forms.Keys.z
は記載されていないので、どの様に処理するのが定番なのかと
考えていたのです。
"A"やら"a"をハードコーディングすれば要求は達成できるのですが
System.Windows.Forms.Keys..の意味が無くなるし。

数値、デシマル、カンマ及び入力操作に使用するキーだけを
透過させるコードで、標準的に使用できるコードをご教授願えませんか?




りばぁ
大ベテラン
会議室デビュー日: 2003/11/26
投稿数: 130
お住まい・勤務地: 愛知県
投稿日時: 2004-02-17 09:51
こんにちわ。
http://www.grapecity.com/japan/dotnet/spreadwin/P7_254.htm

などを利用されれば、そのような苦労をしなくても済むのですが・・・^^;

予算等の問題もあるでしょうけど。
ZingBay
常連さん
会議室デビュー日: 2004/02/16
投稿数: 27
お住まい・勤務地: 古の奈良
投稿日時: 2004-02-17 09:58
りばあ様
レス有難うございます。

自社ブランドに拘りたがる上司が居りまして(苦)。あと予算と(笑)

やはり、べたべたにハードコーディングするしか無いのですかね?
りばぁ
大ベテラン
会議室デビュー日: 2003/11/26
投稿数: 130
お住まい・勤務地: 愛知県
投稿日時: 2004-02-17 10:07
引用:

ZingBayさんの書き込み (2004-02-17 09:58) より:

自社ブランドに拘りたがる上司が居りまして(苦)。あと予算と(笑)



た、大変ですね^^;予算はともかく、好み(?)で判断する人がいるのは
困り者ですよね・・・。

引用:

やはり、べたべたにハードコーディングするしか無いのですかね?



こういう処理はだいたい、ベタになってしまいそうですね。入力後のチェックでよければ
簡単ですが、入力自体させないようにするとなると・・・。
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2004-02-17 10:24
NAL-6295です。

大文字、小文字を判別しないようにToUpperされたらいいんじゃないですか?

コード:
        Select Case Char.ToUpper(ex.KeyChar)



というわけです。Aとaを判別する必要がありません。
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2004-02-17 10:28
引用:

ZingBayさんの書き込み (2004-02-17 09:17) より:
System.Windows.Forms.Keys.A
(snip)
System.Windows.Forms.Keys.Z
はマニュアルに記載されているのですが、
System.Windows.Forms.Keys.a

System.Windows.Forms.Keys.z
は記載されていないので、どの様に処理するのが定番なのかと
考えていたのです。



まず勘違いされている点があります。
VB6のvbKey〜な定数もそうですが、System.Windows.Forms.Keysは
文字に対する定数(文字コード)ではなく、キーボードのキーに対応した定数(キーコード)です。
キーコードにaとAの区別はなく、
「キートップにAと印字されたキー」=Keys.Aです。

KeyPressイベントはキーボードの操作を追跡するイベントではなく、
キー操作により入力された文字データを操作するイベントですので、
KeyPressイベント内で使用するのはキーコードではなく、文字コードが正解です。
VB6でのvbKey〜を使う手法は、ある文字を入力する場合に、
文字コードとキーコードが同じであることを利用しているに過ぎません。
つまり、本来の意味から言えば正確なコードではありません。

引用:

数値、デシマル、カンマ及び入力操作に使用するキーだけを
透過させるコードで、標準的に使用できるコードをご教授願えませんか?



標準的に使用できるかどうかは別として、単純に

If (e.KeyChar() > "9" OrElse e.KeyChar() < "0") _
AndAlso e.KeyChar <> "." _
AndAlso e.KeyChar <> "-" _
AndAlso e.KeyChar() <> vbBack Then

e.Handled = True
End If

のような感じで用途に応じて不要なキーだけはじけばよいと思います。
もちろんこれだけだと"-"や"."を2個以上入れられた場合や
その入力位置等の制御はありませんので、完全ではありません。
この例では、ペーストにも対策はしていません。
(カンマは入力させません)

問題はどこまでやるか?です。コストパフォーマンスを考えて、
どこまで対応するか決めてください。

スキルアップ/キャリアアップ(JOB@IT)