6

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

目前我正在 Android 上进行测试,我能够集成条码的扫描和读取,但是当从查找条码的共享活动返回时,'onBarCode' 事件不会触发。相同的代码在以前版本的 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 用于验证事件也没有触发。我可以确认条形码正在被读取,因为如果我点击并手动粘贴,条形码就会显示。

为什么这在 XE7 上不像在以前版本的 Rad Studio 中那样工作?

4

4 回答 4

6

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

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

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

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

于 2014-10-24T15:19:10.863 回答
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 使用计时器和剪贴板的解决方法)。

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

于 2014-10-08T16:07:12.107 回答
1

这段代码对我有用!

运行扫描代码时将启用的计时器设置为真

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;
于 2014-10-10T15:25:00.643 回答
1

这段代码对我来说很好用!

在 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;
于 2015-03-12T17:39:28.300 回答