1

摩托罗拉符号条形码扫描器与委托事件函数一起使用,如果我尝试在该空间的上下文中禁用扫描器,我会得到一个空引用异常。

如果我只是禁用扫描仪但在该功能之外执行一切正常。

任何想法如何解决这个问题?扫描会打开一个新表单,这意味着需要禁用扫描仪...

4

4 回答 4

2

您可以在扫描仪回调函数中触发计时器。然后在计时器滴答回调中禁用设备。请记住,如果在计时器滴答之前再次点击扫描仪回调,您将需要重置计时器。否则可能会导致从扫描仪接收到的数据丢失。

于 2013-03-07T02:21:29.347 回答
1

扫描仪的启用是属性还是您实际上需要将其关闭?

在我使用的扫描仪无法关闭的项目中,我用我自己的来抽象他们的库,并在我的库上有一个 Enabled 属性。然后在我的课堂上,我只是让真实扫描仪的实例保持运行,如果我的 Enabled 属性被关闭,我没有向外部课堂提出事件。

因此,您也许可以在这里做类似的事情。

void ScannerCallback(object sender, EventArgse)
{
    if (Enabled)
    { 
      OnBarcodeArrived(this, EventArgs.empty);
    }
}
于 2013-03-07T03:00:44.583 回答
1

保罗的想法看起来很有趣。

另一种选择是根据使用该控件的 GotFocus 和 LostFocus 事件选择的控件来启用/禁用扫描仪。

一个事件可以连接所有这一切。

private void Control_FocusChanged(object sender, EventArgs e) {
  ScannerEnabled = ((Control)sender).Focused;
}

(不过,您必须对该ScannerEnabled变量进行编码。

属性窗口

于 2013-03-07T13:29:34.280 回答
0

我强烈建议您将扫描仪对象或围绕该对象的包装器创建为项目中的单例。我发现几个供应商的数据收集对象的 Dispose 处理是不确定的,对象的快速重建更是如此。通过使用单例,您可以避免整个问题。一个在启动时创建,一个在程序关闭时处理。

于 2013-03-13T12:27:43.053 回答