在我的应用程序中,使用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上运行?
答案 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;