【VB.Net】KeyPressイベントでUSB接続されたバーコードリーダからの情報を受け取る

どうも!リョクちゃです。

今回は、前回ぐらいにバーコードリーダから読み取った値を受け取る方法で

TextBoxChangedやKeyDownイベントを使って受け取れるといった話をしましたが

これ以外にKeyPressイベントを使った方法もあったので紹介していきます。

ちなみに前回はこちら

スーパーなどでよく見かけるバーコードリーダー、店員さんがレジで商品のバーコードを読むのに使われていますね。どうやって読み取った値から価格を取得しているのか?読み取った値が間違っていることはないのか?など気になったことはありませんか?そんな気になる悩みについて、簡単に調べてまとめてみました。参考になれば嬉しいです。

目次

準備編:Windowsフォームの作成

画面は、前回作成した画面を引き続き利用します。

ラベルコントロールとテキストボックスコントロールを

配置している至ってシンプルな画面です。

起動するとカーソルがテキストボックスに合っていると思うので、

カーソルを合わせる処理は省略しちゃいます。

プログラム編

ここからはいくつかの項目に分けてプログラムを組んでいきます。

スポンサーリンク




KeyPressイベントを書く

KeyPressイベントは以下のようにして記述することができます。

VisualStudio上のデザイン画面でもコードを生成することができます。

Form上に配置されたTextBoxを右クリックし、

プロパティを選択すると下図の画面が表示されます。

プロパティの雷マーク(図の赤丸)をクリックします。

キーの項目にKeyPressがあるので、これをダブルクリックすることで

KeyPressイベントを自動で作成してくれます。

終端キーかどうか検知する関数の作成

USB接続のバーコードリーダからPCに送られる値は、1文字ずつでした。

どの文字が終端を表すキーなのかどうかを検知する処理が必要になりますね。

これを関数を作成することで、検知したら次の処理へ進めるようにします。

終端キーは、あらかじめ設定しておくことで関数を呼び出すときに省略できますね。

こんな感じの関数を作りました。

実装

KeyPressイベントの中に終端キーかどうかを検知する関数を組み込んでいきます。

これだけでは完成ではありません。以下の項目の処理を追記する必要があります。

  • 終端キーを受け取る処理
  • 終端キーだった場合の処理
  • 終端キーではない場合の処理
  • エラーをキャッチした時の処理

これらを追記していきます。

終端キーを受け取る処理

終端キーを受け取るには、KeyPressイベントの引数として渡される変数eを活用します。

変数eの型は、KeyPressEventArgsになり、これにKeyPressイベントのデータが渡されます

つまり、押したキーの情報が変数eにはイベントが呼び出されたときに格納されます。

押されたキーの情報は、ASCII文字と関連付けられており

各キーに対応したASCII文字を受け取ることもできます

今回は、ASCII文字として受け取ることで

終端キーを受け取ったかどうかを検知していきます。

キー情報を受け取るには、以下のコードになります。

これでキー情報をASCII文字で受け取れます

ただ、これだけでは使いづらいのでASCII文字を文字コードとして受け取ります。

AscWメソッドを使うことで、()内に渡されたASCII文字を文字コードにして返してくれます

例えば、Enterキーを押してKeyPressイベントが呼び出された場合

e.KeyCharでは、”vbCr“となります。

これをAscWメソッドに渡すと、”13“と返されます。

13という文字コードがASCII文字のEnterキー(CR)にあたります。

ちなみにASCII文字では、EnterCR(キャリッジリターン)として扱われます。

この文字コードを検知したら、終端キーと扱い、以降の処理を行います。

入力されたキーを受け取る処理として、変数InputKeyを作成します

終端キーだった場合の処理

全てのバーコード情報が受け取られたことを意味しているので、終端キーだった場合は

読取ったバーコードが正しいかを確認し、桁数確認処理などの読取り後の処理を記述します。

終端キーではない場合の処理

バーコードが読み取り中であるとして、処理を行います。

バーコードリーダから送られてくるデータは1文字ずつでしたので、

あらかじめ読取りデータを格納する変数を用意しておき、この変数に1文字ずつのデータを

格納していきます。

既に入力されたキーの情報は、変数InputKeyにて受け取っているので

これを活用し、読取りデータを格納する変数(readData)に格納させていきます。

途中で他のキーが押される場合もあるかもしれませんが、今回はこれらは考慮しないで

コードを書いていきます。

ChrWメソッドを使って変数InputKeyの情報を文字に変換しています

ChrWメソッドは与えられた文字コードを文字に変換してくれる役割があり、

AscWメソッドとは逆の処理をしてくれます。

ChrWメソッドを使わないで、readDataに代入しようとすると、

型が違うのでエラーとなるため、注意が必要です、

演算子を=ではなく、+=にしているのは、1文字ずつ受け取った情報を連結して

最終的には1つの文字列として扱う必要があるので+=にしています。

エラーをキャッチした時の処理

キャッチした時は、エラーの内容をメッセージボックスで表示するようにしておきます。

実際にアプリケーションとして運用する場合は、

ログファイルに記述するための処理を挟むのがいいでしょう。

ログファイルについては、また別の機会で話せたら……。

以下のような処理にしておきます。

ex.Messageキャッチした時のエラー内容を見ることができます

最終コード

以上の処理を付け足すことで、バーコードリーダから読取ったデータを

1文字ずつ見て、処理をして最終的に1つの文字列として扱い読取り後の処理へ

つなげていきます。

今回での実装したコードは以下になります。

まとめ

バーコードリーダから受けとった情報を処理する方法として、

KeyPressイベントを使った方法について紹介していきました。

KeyPressイベントでは、Enterキーを受け取ってから処理をするのではなく

1文字ずつをチェックしつつ処理ができるようになります。

試しに実装してみてはいかがでしょうか、参考になれば嬉しいです。

最後までお読みいただき、ありがとうございます。

・こちらの書籍を参考にVB.Net勉強しています。

スポンサーリンク