当前位置: 代码迷 >> PB >> 关于失去焦点的编辑框条码的扫入有关问题
  详细解决方案

关于失去焦点的编辑框条码的扫入有关问题

热度:290   发布时间:2016-04-29 05:15:34.0
关于失去焦点的编辑框条码的扫入问题
本帖最后由 surffen 于 2015-06-08 18:12:10 编辑
  数据窗口有多列都可以编辑也有不可编辑的,但只有一个列是刷条码的
 现在的要求是 当其他列编辑完但还没有失去焦点时 接着直接扫条码,此时要区分开来扫的条码是多少(条码长度固定是10位数字)
 这种有些可以在itemchanged事件取data右10位,但如果 此列的长度只能输入6位,后面的值自动截掉了 data取不到 
所以统一在 key事件来处理 
目前判断是手输与刷条码的区别是续按10个键加一个回车键的时间间隔 的时候小于 如0.1秒 
问题是这上 0.1 有时不准,有是明明刷的条码时间也会超过0.1,调大点也还是存在.再大的话又区分不了手输值还是刷的条码
   不知道 有什么更好的办法来处理这种问题?
刷条码设备是 USB接口的

------解决思路----------------------
我建议你判断两个字符输入的间隔为0.1秒,不要判断整个输入,你可以参考以下内容



最近为公司开发一个生产系统,其中用到扫描枪输入条码,结果发现手头的扫描枪居然是模拟键盘输入将条码数据直接发送到焦点控件中的(USB口的),比如TextBox,而由于业务要求,不允许生产线上员工手工输入,因此我将文本框设为只读,想不到扫描枪也无法输入了。

看来想通过控件的键盘事件去识别扫描枪输入与键盘输入是行不通的。百度了下,也没找到好的解决方案,不过得到了一个通过检测按键间隔来识别是否为人工输入的思路,经过多番研究和调试,终于完成了功能,并且将该功能完美封装在类中,实现了降低耦合的要求,并归入自定义DLL中,作为一个通用库的一部分。

基本思路为:使用时间类型变量记录每次按键发生时间,计算两次按键之间的时间间隔,如果超时,则认为是键盘输入,变量初始化为MinValue,用来区分是否是首次按键。间隔限定100毫秒,因为扫描仪输入间隔非常快,以此区分。

类的方法负责接收发送者和发送文本,负责开启计时器跟踪,保存每次调用的时间,计算两次输入间隔,第一次输入或出现超时则发送清空输入事件通知,其次,计时器计算按键后是否超时并发送清空输入事件。窗口程序每当发生输入则调用类方法,并通过对象事件相应清空文本框。

重点:如何判断扫描仪扫描条码结束还是手工按键间隔,仅通过2次按键间隔判断无法检查最后一个字符,因为两次按键间隔是在后一次按键发生时才会被动检查两次按键间隔时间,而如果是到达了最后一个字符,后面就不会再有按键发生,那么按键检查就不会执行。直到下一次扫描或按键才会去检查前一次扫描情况。因此定义了一个计时器来跟踪每次按键后的超时情况,这样即便遇到最够一个按键,没有调用函数,计时器也会发现超时,两者结合解决问题。
------解决思路----------------------
改成串口的吧  用USB模拟串口吧
  相关解决方案