2014-10-03 10 views
6

In meiner App, entwickelt mit XE7 für Android/iOS, habe ich ein Formular zum Scannen von Barcodes. Bei einem gefundenen Barcode überprüft meine App, ob es sich um einen akzeptablen Barcode handelt oder nicht. Folgende Lernprogramme hier: http://www.fmxexpress.com/qr-code-scanner-source-code-for-delphi-xe5-firemonkey-on-android-and-ios/Barcode lesen Delphi xe7, Ereignis nach Absicht nicht auslösen

Momentan teste ich auf Android und ich bin in der Lage, Scannen und Lesen von Barcodes zu integrieren, aber das 'onBarCode' Ereignis wird nicht ausgelöst, wenn von der gemeinsamen Aktivität des Findens des Barcodes zurückgegeben. Derselbe Code funktionierte gut mit früheren Versionen von Rad Studio (XE4, XE5, XE6), aber jetzt in XE7 nicht.

Hier sind einige Code-Schnipsel:

... 
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 ist auch verwendet, um I-Barcode auf eine Liste zu validieren und hinzufügen, aber ich tat es sind, weil dieser Code ist nicht das Problem - es ist nicht sogar auslösend. Der Text1.text: = Barcode und memo1.paseFromClipboard waren in ihrer für die Validierung der sogar nicht feuern auch. Ich kann bestätigen, dass die Barcodes gelesen werden, denn wenn ich tippe und manuell einfüge, wird der Barcode angezeigt.

Warum funktioniert das auf XE7 nicht wie in früheren Versionen von Rad Studio?

+0

Welcher Leser Android Barcode ist es? (Der Klassenname TAndroidBarcodeReader gibt nicht an, ob es zbar oder zxing ist) – mjn

+0

http://www.fmxexpress.com/wp-content/uploads/2014/03/TKRBarCodeSanner.zip ist der dritte Link, auf dem Ressourcen für die Artikel zum Scannen – ThisGuy

+0

Die TTKRBarCodeScanner-Klasse in der ZIP verwendet 'com.google.zxing.client.android.SCAN', also nehme ich an, dass es auf ZXing basiert. Eigentlich könnten Sie die in meiner Antwort gezeigten Zeilen anstelle der Komponente/Klasse TAndroidBarcodeScanner verwenden (die im 20,3 MB großen Download unter http://cc.embarcadero.com/Download.aspx zu finden ist).id = 29699 Wenn ich richtig verstehe) – mjn

Antwort

5

Andrea Magni hat eine elegantere Lösung als der Timer auf seinem Blog auf Basis von Event-Handling.

Ich würde kommentieren, um den Link zu senden, aber ich habe nicht genug Ruf. Der Link zu seinem Blog ist:

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

Vielleicht können diese Ihnen helfen. Der Blog ist zwar auf Italienisch, aber die Quellen werden zur Verfügung gestellt und erklären sich selbst.

2

Es ist ein Quellcode-Fragment auf http://john.whitham.me.uk/xe5/ die nutzbare aussieht (basierend auf ZXing):

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

Der Code im verlinkten Artikel zeigt auch, wie das Intent Ergebnis erhalten. (Ich arbeite nicht mit Delphi unter Android, daher bin ich mir nicht sicher, ob dieser Teil eine Best Practice verwendet - TTKRBarCodeScanner verwendet eine Problemumgehung mit einem Timer und der Zwischenablage).

Ich würde versuchen, dies als eine Alternative zu sehen, ob funktioniert.

+0

Vielen Dank für die Antworten. +1 für den Timer-Vorschlag - mit einem Timer funktioniert. Meine Frage war genauer gesagt, WARUM die gebrauchte Einheit auf XE7 nicht funktioniert, aber wenn ich keine direkte Antwort bekomme, werde ich Ihnen die Prämie belohnen. Vielen Dank ! – ThisGuy

1

Dieser Code funktioniert mir!

Set Timer auf true aktiviert, wenn Sie Ihre Scan-Code ausführen

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; 
1

Dieser Code für mich funktioniert gut!

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;