どうも!リョクちゃです。
今回は、前回ぐらいにバーコードリーダから読み取った値を受け取る方法で
TextBoxChangedやKeyDownイベントを使って受け取れるといった話をしましたが
これ以外にKeyPressイベントを使った方法もあったので紹介していきます。
ちなみに前回はこちら
目次
準備編:Windowsフォームの作成
画面は、前回作成した画面を引き続き利用します。
ラベルコントロールとテキストボックスコントロールを
配置している至ってシンプルな画面です。
起動するとカーソルがテキストボックスに合っていると思うので、
カーソルを合わせる処理は省略しちゃいます。
プログラム編
ここからはいくつかの項目に分けてプログラムを組んでいきます。
KeyPressイベントを書く
KeyPressイベントは以下のようにして記述することができます。
1 2 3 |
Private Sub テキストボックスのコントロール名_KeyPress(sender As Object, e As KeyPressEventArgs) Handles テキストボックスコントロール名.KeyPress 処理 End Sub |
VisualStudio上のデザイン画面でもコードを生成することができます。
Form上に配置されたTextBoxを右クリックし、
プロパティを選択すると下図の画面が表示されます。
プロパティの雷マーク(図の赤丸)をクリックします。
キーの項目にKeyPressがあるので、これをダブルクリックすることで
KeyPressイベントを自動で作成してくれます。
終端キーかどうか検知する関数の作成
USB接続のバーコードリーダからPCに送られる値は、1文字ずつでした。
どの文字が終端を表すキーなのかどうかを検知する処理が必要になりますね。
これを関数を作成することで、検知したら次の処理へ進めるようにします。
終端キーは、あらかじめ設定しておくことで関数を呼び出すときに省略できますね。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
''' <summary> ''' 終端キーかどうかを判定し返す ''' </summary> ''' <param name="InputKey"></param> ''' <returns></returns> ''' <remarks></remarks> Private Function CheckTerminalKey(ByVal InputKey As System.Windows.Forms.Keys) As Boolean Dim result As Boolean = False If terminalKey = Inputkey Then result = True End If Return result End Function |
こんな感じの関数を作りました。
実装
KeyPressイベントの中に終端キーかどうかを検知する関数を組み込んでいきます。
1 2 3 4 5 6 7 8 9 10 11 12 |
Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress Try ' 終端キーかどうか検知します。 If CheckTerminalKey(InputKey) Then ' 終端キーだった場合の処理 Else ' 終端キーではない場合の処理 End If Catch ex As Exception ' エラーをキャッチした時の処理 End Try End Sub |
これだけでは完成ではありません。以下の項目の処理を追記する必要があります。
- 終端キーを受け取る処理
- 終端キーだった場合の処理
- 終端キーではない場合の処理
- エラーをキャッチした時の処理
これらを追記していきます。
終端キーを受け取る処理
終端キーを受け取るには、KeyPressイベントの引数として渡される変数eを活用します。
変数eの型は、KeyPressEventArgsになり、これにKeyPressイベントのデータが渡されます。
つまり、押したキーの情報が変数eにはイベントが呼び出されたときに格納されます。
押されたキーの情報は、ASCII文字と関連付けられており
各キーに対応したASCII文字を受け取ることもできます。
今回は、ASCII文字として受け取ることで
終端キーを受け取ったかどうかを検知していきます。
キー情報を受け取るには、以下のコードになります。
1 |
e.KeyChar |
これでキー情報をASCII文字で受け取れます。
ただ、これだけでは使いづらいのでASCII文字を文字コードとして受け取ります。
1 |
AscW(e.KeyChar) |
AscWメソッドを使うことで、()内に渡されたASCII文字を文字コードにして返してくれます。
例えば、Enterキーを押してKeyPressイベントが呼び出された場合
e.KeyCharでは、”vbCr“となります。
これをAscWメソッドに渡すと、”13“と返されます。
13という文字コードがASCII文字のEnterキー(CR)にあたります。
ちなみにASCII文字では、EnterはCR(キャリッジリターン)として扱われます。
この文字コードを検知したら、終端キーと扱い、以降の処理を行います。
入力されたキーを受け取る処理として、変数InputKeyを作成します。
1 |
Dim Inputkey As Keys = CType(AscW(e.KeyChar), Keys) |
終端キーだった場合の処理
全てのバーコード情報が受け取られたことを意味しているので、終端キーだった場合は
読取ったバーコードが正しいかを確認し、桁数確認処理などの読取り後の処理を記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
Public Class TestBarCode Private Const CORRECT_DIGIT As Integer = 12 Private terminalKey As Keys = Keys.Enter Private readData As String = "" Private Function CheckTerminalKey(ByVal InputKey As System.Windows.Forms.Keys) As Boolean Dim result As Boolean = False If terminalKey = InputKey Then result = True End If Return result End Function Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress Try ' 押されたキーの情報を受け取ります。 Dim Inputkey As Keys = CType(AscW(e.KeyChar), Keys) ' 終端キーかどうか検知します。 If CheckTerminalKey(Inputkey) Then ' 終端キーだった場合の処理 ' 読取りデータの加工処理を行います。 ' 桁数が正しいかどうかの判定 If readData.Length <> CORRECT_DIGIT Then ' 正しい桁数じゃない場合、エラー MessageBox.Show("桁数が違います。", "桁数エラー", MessageBoxButtons.OK, MessageBoxIcon.Error) Return End If Else ' 終端キーではない場合の処理 End If Catch ex As Exception ' エラーをキャッチした時の処理 End Try End Sub End Class |
終端キーではない場合の処理
バーコードが読み取り中であるとして、処理を行います。
バーコードリーダから送られてくるデータは1文字ずつでしたので、
あらかじめ読取りデータを格納する変数を用意しておき、この変数に1文字ずつのデータを
格納していきます。
既に入力されたキーの情報は、変数InputKeyにて受け取っているので
これを活用し、読取りデータを格納する変数(readData)に格納させていきます。
途中で他のキーが押される場合もあるかもしれませんが、今回はこれらは考慮しないで
コードを書いていきます。
1 2 |
' 終端キーではない場合の処理 readData += ChrW(InputKey).ToString |
ChrWメソッドを使って変数InputKeyの情報を文字に変換しています。
ChrWメソッドは与えられた文字コードを文字に変換してくれる役割があり、
AscWメソッドとは逆の処理をしてくれます。
ChrWメソッドを使わないで、readDataに代入しようとすると、
型が違うのでエラーとなるため、注意が必要です、
演算子を=ではなく、+=にしているのは、1文字ずつ受け取った情報を連結して
最終的には1つの文字列として扱う必要があるので+=にしています。
エラーをキャッチした時の処理
キャッチした時は、エラーの内容をメッセージボックスで表示するようにしておきます。
実際にアプリケーションとして運用する場合は、
ログファイルに記述するための処理を挟むのがいいでしょう。
ログファイルについては、また別の機会で話せたら……。
以下のような処理にしておきます。
1 2 |
' エラーをキャッチした時の処理 MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) |
ex.Messageでキャッチした時のエラー内容を見ることができます。
最終コード
以上の処理を付け足すことで、バーコードリーダから読取ったデータを
1文字ずつ見て、処理をして最終的に1つの文字列として扱い読取り後の処理へ
つなげていきます。
今回での実装したコードは以下になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
Public Class TestBarCode Private Const CORRECT_DIGIT As Integer = 12 Private terminalKey As Keys = Keys.Enter Private readData As String = "" ''' <summary> ''' 終端キーかどうかを判定し返す ''' </summary> ''' ''' <param name="InputKey"></param> ''' ''' <returns></returns> ''' ''' <remarks></remarks> Private Function CheckTerminalKey(ByVal InputKey As System.Windows.Forms.Keys) As Boolean Dim result As Boolean = False If terminalKey = InputKey Then result = True End If Return result End Function Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress Try ' 押されたキーの情報を受け取ります。 Dim Inputkey As Keys = CType(AscW(e.KeyChar), Keys) ' 終端キーかどうか検知します。 If CheckTerminalKey(Inputkey) Then ' 終端キーだった場合の処理 ' 読取りデータの加工処理を行います。 ' 桁数が正しいかどうかの判定 If readData.Length <> CORRECT_DIGIT Then ' 正しい桁数じゃない場合、エラー MessageBox.Show("桁数が違います。", "桁数エラー", MessageBoxButtons.OK, MessageBoxIcon.Error) Return End If Else ' 終端キーではない場合の処理 Console.WriteLine(ChrW(Inputkey)) readData += ChrW(Inputkey).ToString End If Catch ex As Exception ' エラーをキャッチした時の処理 MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try End Sub End Class |
まとめ
バーコードリーダから受けとった情報を処理する方法として、
KeyPressイベントを使った方法について紹介していきました。
KeyPressイベントでは、Enterキーを受け取ってから処理をするのではなく
1文字ずつをチェックしつつ処理ができるようになります。
試しに実装してみてはいかがでしょうか、参考になれば嬉しいです。
最後までお読みいただき、ありがとうございます。
・こちらの書籍を参考にVB.Net勉強しています。