条形码读取Delphi xe7,意图不触发后的事件

时间:2014-10-03 17:01:51

标签: android delphi barcode zxing delphi-xe7

在我的应用程序中,使用XE7 for Android / iOS开发,我有一个用于扫描条形码的表单。找到条形码后,我的应用程序会验证它是否是可接受的条形码。以下教程:http://www.fmxexpress.com/qr-code-scanner-source-code-for-delphi-xe5-firemonkey-on-android-and-ios/

目前我正在Android上进行测试,我可以集成扫描和阅读条形码,但是' onBarCode'从共享的查找条形码的Activity返回时,事件不会触发。相同的代码与以前版本的Rad Studio(XE4,XE5,XE6)运行良好,但现在在XE7中却没有。

以下是一些代码片段:

...
begin
    Scanner := TAndroidBarcodeScanner.Create(true);
    Scanner.OnBarCode := BarcodeHandler;
    Scanner.Scan;
end;

procedure TmScannerForm.BarcodeHandler(Sender: TAndroidBarcodeScanner;
  BarCode: String);
begin
  text1.Text := Barcode;
  memo1.PasteFromClipboard;
  AddBarcode(BarCode, true);
end;

AddBarCode是我用来验证条形码并将其添加到列表中的偶数,但我没有包含它,因为该代码不是问题 - 它甚至没有触发。 Text1.text:= Barcode和memo1.paseFromClipboard用于验证甚至还没有解雇。我可以确认正在读取条形码,因为如果我点击并手动粘贴,条形码会显示。

为什么这不能像以前版本的Rad Studio那样在XE7上运行?

4 个答案:

答案 0 :(得分:5)

Andrea Magni基于事件处理在他的博客上提供了比计时器更优雅的解决方案。

我会评论发送链接,但我没有足够的声誉。 他博客的链接是:

http://blog.delphiedintorni.it/2014/10/leggere-e-produrre-barcode-con-delphi.html

也许这可以帮到你。该博客虽然是意大利语,但提供的资料来源并自行解释。

答案 1 :(得分:2)

http://john.whitham.me.uk/xe5/上有一个看似可用的源代码片段(基于Zxing):

 intent := tjintent.Create;     
 intent.setAction(stringtojstring('com.google.zxing.client.android.SCAN'));
 sharedactivity.startActivityForResult(intent,0);

链接文章中的代码还说明了如何接收Intent结果。 (我不能在Android上使用Delphi,因此我不确定该部分是否使用最佳实践--TTKRBarCodeScanner使用Timer和剪贴板的解决方法)。

我会尝试将其作为替代方案,看看是否有效。

答案 2 :(得分:1)

此代码对我有用!

运行扫描代码时将计时器设置为true

procedure Tform.Timer1Timer(Sender: TObject);
begin
if  (ClipService.GetClipboard.ToString <> '')  then
  begin
     timer1.Enabled:=false;
      zSearch.Text := ClipService.GetClipboard.ToString;
     //Do what you need
  end;

end;

答案 3 :(得分:1)

此代码对我来说工作正常!

in andorid.BarcodeScanner

function TAndroidBarcodeScanner.HandleAppEvent(AAppEvent: TApplicationEvent;
  AContext: TObject): Boolean;
var
  aeBecameActive : TApplicationEvent;
begin
  aeBecameActive := TApplicationEvent.BecameActive;
  if FMonitorClipboard and (AAppEvent = aeBecameActive) then
  begin
    GetBarcodeValue;
  end;
end;