バーコードリーダーで読み取り、処理を実行させるには?

解決


ぺんね  2008-02-27 15:39:55  No: 139103  IP: 192.*.*.*

VB6を使用しています。

バーコードリーダーで「END」という文字列のバーコードを読んだ際に、
数量が合っているかを比較するというプログラムを作りたいのですが、
ENDという文字を画面上に出力させないで、プログラムを動作させる事は可能
なのでしょうか?
また、可能な場合、どのようにしたら良いのでしょうか?
お手数ですが、アドバイスの方をよろしくお願いします。

編集 削除
K.M  2008-02-27 15:52:03  No: 139104  IP: 192.*.*.*

>ENDという文字を画面上に出力させないで、
誰が表示させてるか調べて出さないようにしてください

編集 削除
ぺんね  2008-02-27 16:11:49  No: 139105  IP: 192.*.*.*

すいません、アドバイスの意味が理解出来ませんでした。。。

例えば、TextBox AとTextBox Bに値が入っている状態で、
ENDという文字列のバーコードを読み取り、処理を開始させ、
A、B共に、数値が合っていれば認証OK、
合っていなければ認証NGと出力させたいのです。
説明が下手で、理解しづらいとは思いますが、
どうか、アドバイスをお願いします。

編集 削除
すがっち  2008-02-27 17:31:34  No: 139106  IP: 192.*.*.*

ENDという文字は誰がどこに表示させてるのですか?

編集 削除
(報告)  2008-02-27 18:23:17  No: 139107  IP: 192.*.*.*

[マルチポストについて]
http://www.ippo.ne.jp/g/53.html

http://www2.moug.net/bbs/program/20080225000005.htm

編集 削除
ぺんね  2008-02-28 08:27:30  No: 139108  IP: 192.*.*.*

すがっちさん

>ENDという文字は誰がどこに表示させてるのですか?

ENDというバーコードをテプラで作成し、その文字がトリガーとなって処理を実行させるプログラムを作成したいと思っています。

マルチポストについて

すいません。
掲示板のルールを理解していませんでした。
以後、気をつけます。
こちらの方で質問させていただきます。

編集 削除
さるべーじ  URL  2008-02-28 11:10:26  No: 139109  IP: 192.*.*.*

最近のバーコードリーダーであれば、一般的にはキーボードモードと
外部入力機器モードがあると思います。
(モード名は私が勝手に名付けているだけですが)

キーボードモードは、バーコードリーダーを2台目のキーボードとして
Windowsに認識させます。この場合のデバイスドライバは、
キーボードドライバとして動作します。

形状はともかくWindowsはキーボードとして認識していますので、
TextBox等入力文字列を画面に表示するコントロール上での動作が前提となります。

ぺんねさんの現在の状態は、キーボードモードで接続しているのではないでしょうか。

であれば、KeyDownイベントなどでバーコードリーダから送り込まれた
キーコードを取得してからKeyPressイベントを発生させないように
キーコードをクリアする、などの手法が考えられます。

もうひとつ、バーコードリーダーをキーボードとしてではなく
外部入力機器としてWindowsに認識させるという方法もあります。

このあたりはメーカーや製品によって対応や提供形態が違いますので、
使用説明書・開発資料を当たるか、メーカーに問い合わせてみてください。

こちらの方法では送られてきたデータを独自に取得する機能を実装することに
なりますので、明示的に表示機能を作り込まない限り画面上に表示されることは
ありません。

ただしキーボードモード接続時の制御より作り込みが難しくなりますし、
参考となるサンプルがあまりなくほとんど自力で制御ロジックを作り込んで
いくこととなります。

# ちなみに、プログラムを「誰」等の人称で呼ぶのは、あまり一般的ではありません。
# 今回は、元質問者の方に逆質問の意図が十分に伝わっていないように感じます。

編集 削除
ぺんね  2008-02-28 13:37:17  No: 139110  IP: 192.*.*.*

さるべーじさん

的確に的を得たアドバイス、本当にありがとうございます。

>一般的にはキーボードモードと
外部入力機器モードがあると思います。

自分はキーボードモードでした。

>KeyDownイベントなどでバーコードリーダから送り込まれた
キーコードを取得してからKeyPressイベントを発生させないように
キーコードをクリアする、などの手法が考えられます。

すいません、KeyDown、KeyPressイベントを調べてみたのですが、
いまいち、使い方が分かりませんでした。
出来れば、使い方などを詳しく教えて頂けたらなと思います。
よろしくお願いします。

#プログラム=「誰」

こういうことだったんですね。
勉強になりました。

編集 削除
Xoner  2008-02-28 22:53:20  No: 139111  IP: 192.*.*.*

>いまいち、使い方が分かりませんでした。

ヘルプにある「KeyPress イベントの例」を実行してみたのでしょうか?
たった4行なんですけど・・・

>テキスト ボックス コントロールを含むフォーム モジュールのコード
>エディタ ウィンドウに下のコードを貼り付け、F5 キーを押します。

編集 削除
さるべーじ  URL  2008-02-29 03:59:48  No: 139112  IP: 192.*.*.*

ぺんねさんの

> いまいち、使い方が分かりませんでした。

は、

    KeyPressイベントの使い方がわからない

ではなく、

    KeyPressイベント内で「END」が入力されたかどうか判定しつつ
    入力された文字を無効にするにはどう記述していいかわからない

というお話だと思います。

元々のお話が

> ENDという文字を画面上に出力させないで、
> プログラムを動作させる事は可能なのでしょうか?

ですから、現状のFormデザインではTextBox等キーボードからの文字入力を
受け付けるコントロールがあり、かつそこにフォーカスがあるのだろうと
推測します。

これを踏まえると、例えば

Private Sub Form_KeyPress(KeyAscii As Integer)

    Static strBuffer As String

    Select Case KeyAscii
        Case Asc("E"), Asc("N"), Asc("D")
            strBuffer = strBuffer & Chr$(KeyAscii)
            If Left$("END", Len(strBuffer)) <> strBuffer Then
                strBuffer = ""
            End If
            KeyAscii = 0
        Case Asc(vbCrLf)
            If strBuffer = "END" Then
                MsgBox "「END」キター!"  '「END」が入力された時の処理
                KeyAscii = 0
            End If
            strBuffer = ""
    End Select

End Sub

のような感じになるかと思います。

ポイントは、

    ★ FormのKeypreview=Trueにすることで、どのコントロールに
       コントロールにフォーカスがあっても同じように動作させる。
    ★ KeyPressイベントは1文字ごとに発生するので、連続した文字列を
       判定したい場合は、過去の入力文字を記録しておく必要がある。
       (上記サンプルではstrBufferをStaticで用意して格納しています)
    ★ バーコードリーダーから入力される文字列の最後にEnterを
       送らせる設定にし(バーコードリーダーの設定オプションにあるはずです)、
       入力文字列のチェックをvbCrLf(Enter=CRLF)入力時に限る。
    ★ 入力された文字を無効にするには、KeyPressイベント中で
       KeyAsciiに0を代入する。

確かKeyPressで入力クリア(KeyAscii = 0)は、Enter時にBeep音が鳴るように
覚えていますので、それが嫌な場合はKeyDownイベント等を使う必要があったと思います。

また、上記サンプルではTextBoxに「E」「N」「D」が入力できなくなります。
キーボードモードで入力させる以上、どうしても入力コントロールへの影響は
若干あります。
入力コントロールの機能を完全に保証するには、バーコードリーダーを
外部入力機器モード接続としてキーボードと別に処理する必要があります。

編集 削除
めもめも  2008-02-29 04:34:27  No: 139113  IP: 192.*.*.*

>> いまいち、使い方が分かりませんでした。
>は、
>    KeyPressイベントの使い方がわからない
>ではなく、
>    KeyPressイベント内で「END」が入力されたかどうか判定しつつ
>    入力された文字を無効にするにはどう記述していいかわからない
>というお話だと思います。

なるほど、このようにすればコード作成装置が起動するのか・・メモメモ

編集 削除
紅閃光  URL  2008-02-29 18:32:08  No: 139114  IP: 192.*.*.*

>コード作成装置が起動する
ヘルプも見ないで餌(コード)を欲しがって質問する人に容易に餌を与えるな、と注意したいのかな?
少なくとも「コードをくれ」と言ってきているわけでも無いですし、コードをティーチングすることですぐ検証できるわけですから、コードを教えること自体が悪いとは言えないと思いますけどね。

まぁ、100%のコードを書くことには相手のためにもならない、ということにはわたしも賛成です。

さるべーじさんが「ポイント」などで書いてある通り、このコードは決して満点ではありません。
特にバーコードに「E」「N」「D」の文字が使えないということは、実質バーコードにアルファベット交じりの品名や品番は使用できないということになります。
この程度の「問題を内包したコード」は質問者に対してもいい勉強材料になるのではないでしょうか。

わたしが過去に使用したバーコードリーダーではEnterは入力出来ないのもありましたしね。


TextBoxのChangeイベントでENDが入力されていたら、人間の目にも止まらぬ素早さでクリアすれば必要十分かなと思います。


ひねくれ人間のわたしなら、「たとえば」こんなのもありかなと。

Private Sub Form_KeyPress(KeyAscii As Integer)
    Static keyBuffer As String
    keyBuffer = Right$(keyBuffer & KeyAscii, 4)
    Select Case True
    Case InStr(1, keyBuffer, "END") > 0 , InStr(1, keyBuffer, "end") > 0
        MsgBox "「END」キタ━━━━(゜∀゜)━━━━!!"  '「END」が入力された時の処理
        keyBuffer = ""
        TextBox1.Text = ""
    End Select
End Sub

これはわたしが以前に、格闘ゲームのコマンド入力やマウスジェスチャの入力に利用したコードの省略版です。


くれ、と言われたらあげたく無くなるけど、欲しくないといわれたらあげたくなるのも人間ではないでしょうか。
いや、まぁ、関係ないですけど。

編集 削除
メモメモ  2008-03-01 10:20:43  No: 139115  IP: 192.*.*.*

>くれ、と言われたらあげたく無くなるけど、欲しくないといわれ
>たらあげたくなるのも人間ではないでしょうか。

なるほど、このようにすればコード作成装置が起動するのか・・メモメモ

編集 削除
 2008-03-01 13:25:52  No: 139116  IP: 192.*.*.*

なんとか技研からさき、へんなのが常駐しちゃったね
しばらく静観だな

痛い発言は見てて面白いからどんどんやってください。

編集 削除
ぺんね  2008-03-02 22:50:00  No: 139117  IP: 192.*.*.*

忙しくて返信が遅くなり大変申し訳ありませんでした。
一気に返信するのをお許しください。


Xonerさん

>ヘルプにある「KeyPress イベントの例」を実行してみたのでしょうか?
たった4行なんですけど・・・

自分が伝えたかった事は、さるべーじさんの

>KeyPressイベント内で「END」が入力されたかどうか判定しつつ
  入力された文字を無効にするにはどう記述していいかわからない

まさしくこれでした。


さるべーじさん

解説付きで、尚且つ、分かりづらい私の説明を汲み取ってコードまで書いてくださって本当に感謝しています!
さるべーじさんのコードで一発OKでした!
勉強になりました。
また分からない事がありましたら、力を貸してください。

紅閃光さん

コードを拝見させてもらい、このような書き方も出来るのかと勉強になりました。
これからどんどん身に付けていきたいと思います!

めもめもさん

馬鹿にしているのでしょうか?
私は、アドバイスをして下さった人達を物のように使った覚えはありません。
失礼です。
私にアドバイスをして下さった皆様、本当に申し訳ありませんでした。

編集 削除
ところで  2008-03-02 23:07:42  No: 139118  IP: 192.*.*.*

>私は、アドバイスをして下さった人達を物のように使った覚えはありません。
>失礼です。

マルチポストについての見解は?

編集 削除
lol  2008-03-03 00:03:25  No: 139119  IP: 192.*.*.*

>ところで 2008/03/02(日) 23:07:42 
>>私は、アドバイスをして下さった人達を物のように使った覚えはありません。
>>失礼です。
>
>マルチポストについての見解は?

既に謝罪してるだろ?
日本語が読めないならここにいるべきではないな。

編集 削除
ところで  2008-03-03 00:15:19  No: 139120  IP: 192.*.*.*

>私は、アドバイスをして下さった人達を物のように使った覚えはありません。

謝罪すると事実も消え去るのかい!
日本語がわからないのならここにいるべきではないな。

それ以外にもlolは ここにいるべきでない理由も多いけど・・

編集 削除
ぺんね  2008-03-04 08:17:02  No: 139121  IP: 192.*.*.*

すいません、閉じるのを忘れてました。

皆さん、ありがとうございました。

編集 削除