- - PR -
KeyPressイベントの判定
| 投稿者 | 投稿内容 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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ハンドリングのやり方が根本的に違うのでしょうか? 識者の方、ご教授をお願いします。 | ||||||||
|
投稿日時: 2004-02-17 06:53
諸農です。
デバッグしてみればわかるかと思いますが、 a=97 A=65 Keys.A=65 なので、通過します。 _________________ 諸農和岳 Powered by Turbo Delphi & Microsoft Visual Studio 2005 十兵衛@わんくま同盟 http://blogs.wankuma.com/jubei/ | ||||||||
|
投稿日時: 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..の意味が無くなるし。 数値、デシマル、カンマ及び入力操作に使用するキーだけを 透過させるコードで、標準的に使用できるコードをご教授願えませんか? | ||||||||
|
投稿日時: 2004-02-17 09:51
こんにちわ。
http://www.grapecity.com/japan/dotnet/spreadwin/P7_254.htm などを利用されれば、そのような苦労をしなくても済むのですが・・・^^; 予算等の問題もあるでしょうけど。 | ||||||||
|
投稿日時: 2004-02-17 09:58
りばあ様
レス有難うございます。 自社ブランドに拘りたがる上司が居りまして(苦)。あと予算と(笑) やはり、べたべたにハードコーディングするしか無いのですかね? | ||||||||
|
投稿日時: 2004-02-17 10:07
た、大変ですね^^;予算はともかく、好み(?)で判断する人がいるのは 困り者ですよね・・・。
こういう処理はだいたい、ベタになってしまいそうですね。入力後のチェックでよければ 簡単ですが、入力自体させないようにするとなると・・・。 | ||||||||
|
投稿日時: 2004-02-17 10:24
NAL-6295です。
大文字、小文字を判別しないようにToUpperされたらいいんじゃないですか?
というわけです。Aとaを判別する必要がありません。 | ||||||||
|
投稿日時: 2004-02-17 10:28
まず勘違いされている点があります。 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個以上入れられた場合や その入力位置等の制御はありませんので、完全ではありません。 この例では、ペーストにも対策はしていません。 (カンマは入力させません) 問題はどこまでやるか?です。コストパフォーマンスを考えて、 どこまで対応するか決めてください。 | ||||||||
