AW: Problem mit Android Barcodescanner
Ich habe es jetzt mal tatsächlich geschafft das SDK, welches ich vom Hersteller bekommen habe, in meine App einzubinden.
Habe eine Java Bridge erstellt und kann die bereitgestellte Klasse auch ansprechen. Über das OnClick Event eines TButton kann ich nun den Scannvorgang starten. Das war zwar als Test, ob die Implementierung des SDK funktioniert recht nett, aber für meine praktische Anwendung bringt mir das gar nichts. Schließlich soll der Scan ja durch drücken einer der Hardwarescantasten erfolgen und außerdem hat der Scanner zwar den Barcode gesacannt, das obligatorische Beep von sich gegeben, aber der gescannte code erschien nicht im TMemo, auf den ich den Focus gestellt hatte. Ehe ich jetzt noch mehr Zeit mit try and error verplempere, werde ich mal warten, was die von Embarcadero zum Firemonkeybug sagen. |
AW: Problem mit Android Barcodescanner
Ich werde verrückt.
Jetzt habe ich es hinbekommen, dass es funktioniert, aber die Umstände sind merkwürdig und auch unbefriedigend. Nachdem ich mit dem SDK gespielt hatte, ging plötzlich gar nichts mehr. Auch nicht in der Scanner app, wo es vorher funktioniert hatte. Deshalb habe ich da mal scanner reset ausgeführt. Dann ging es wieder. Dann klappte es plötzlich in meiner testapp. In einer anderen wieder klappte es nicht. Dann habe ich mich auf die Suche nach dem Unterschied gemacht. Der war dann darin gelegen, dass ich in einer app im Projektquelltext folgende Zeile hatte: VKAutoShowMode := TVKAutoShowMode.DefinedBySystem; und in der anderen VKAutoShowMode := TVKAutoShowMode.Never; Im ersten Fall poppt das Softwarekeyboard auf und dann funktioniert auch der Scan. Im zweiten Fall poppt kein Keyboard auf und der Scan funktioniert nicht. Blöderweise will ich nicht, dass das Softwarekeyboard aufpoppt, da es mir den halben Screen verdeckt und ich es auch gar nicht brauche, da die Daten per Barcode kommen bzw. über die Hardwaretastatur eingegeben werden können. In der Scannerapp des Gerätes funktioniert der Scan in beiden Fällen. Sollte also grundsätzlich möglich sein. Werde das Embarcadero auch so mitteilen. Bei der Gelegenheit suche ich nun auch nach einer Möglichkeit das Softwarekeyboard nicht standardmäßig aufzumachen, wenn ein Eingabefeld den Focus bekommt, sondern allenfalls das Aufpoppen des Keyboards durch den Anwender initiiert werden kann, in welcher Form auch immer. |
AW: Problem mit Android Barcodescanner
Falls es interessiert, ich habe einen Workaround gefunden.
Habe diesen Thread entdeckt: http://www.delphipraxis.net/186005-v...ktivieren.html Ich habe nun die unit VirtualKeyboardService erstellt und in meine Testapp eingebunden. Die Methoden ShowVirtualKeyboard und HideVirtualKeyboard habe ich allerdings public declariert, damit ich sie auch aufrufen kann. ShowVirtualKeyboard habe ich leicht modifiziert, damit ich notfalls doch das Keyboard anzeigen kann. Zu diesem Zweeck muss ich vor dem Aufruf von ShowVirtualKeyboard das Tag des Editcontrols auf <> 0 setzen.
Code:
Meinem TEdit habe ich einen Button verpasst in dessen OnClick ich Tag mit 0 oder 1 versorge. Dadurch kann ich mit dem Button das Keyboard sichtbar oder unsichtbar machen.
function TVirtualKeyboardService.ShowVirtualKeyboard( const AControl: TFmxObject ): Boolean;
begin if IsOverriddenObject( AControl ) and (acontrol.Tag = 0) then begin HideVirtualKeyboard; Result := False; end else Result := FOriginalService.ShowVirtualKeyboard( AControl ); end;
Code:
Im OnEnter setze ich Tag immer auf 0;
procedure TForm1.EditButton1Click(Sender: TObject);
begin Edit1.Tag := abs (Edit1.Tag - 1); if Edit1.Tag = 0 then TVirtualKeyboardService.Current.HideVirtualKeyboard else TVirtualKeyboardService.Current.ShowVirtualKeyboard(Edit1); end; Das funktioniert erst mal ganz vernünftig. Einziges Problem ist noch, dass der erste Scan nur funktioniert, wenn einmal ein Keyboard angezeigt wurde. Habe deshalb mal Edit1.Tag im Formshow auf -1 gesetzt und im OnEnter von Edit1 im Falle, dass Tag < 0 ist, das Keyboard einmal angezeigt und gleich wieder geschlossen.
Code:
Das funktioniert so, ist aber nicht befriedigend, da es nicht sehr schön ist, wenn das Keyboard kurz angezeigt wird.
procedure TForm1.FormShow(Sender: TObject);
begin Edit1.Tag := -1; end; procedure TForm1.Edit1Enter(Sender: TObject); begin if Edit1.Tag < 0 then begin TVirtualKeyboardService.Current.ShowVirtualKeyboard(Edit1); TVirtualKeyboardService.Current.HideVirtualKeyboard; end; Edit1.Tag := 0; end; Da ich in der richtigen App aber ohnehin zu Beginn eine Login Maske habe und man da sowieso sinnvollerweise ein Keyboard benötigt (und es da auch nicht stört), kann ich mir das dann da eventuell ersparen. Irgendwie ziemlich kompliziert nur für so eine einfache Funktion. Aber was solls, Hauptsache es funktioniert. Wäre aber trotzdem für Anregungen, Verbesserungsvorschläge und Hinweise auf eventuelle Fallstricke bzw. Denkfehler dankbar. |
AW: Problem mit Android Barcodescanner
Bin neugierig , aber evtl hab ich es auch überlesen ,
aber welcher Scanner ist es denn Hersteller / Modell mfg Hannes |
AW: Problem mit Android Barcodescanner
Es ist dieser Scanner:
http://www.ruggedscanners.com/obm-a5...-p00017p1.html Habe ihn aus China importiert. Das Teil ist sehr ansprechend. Super look and feel. Bin damit sehr zufrieden. Ist mal ein Test für weitere um sie dann für Lagerwirtschaft einzusetzen. Übrigens habe ich nun eine deutlich einfachere Lösung meines Problems gefunden. Kommt ohne die unit VirtualKeyboardService aus. Zuerst setze ich im Projektquelltext wieder VKAutoShowMode := TVKAutoShowMode.Never; Dadurch entfällt das umständliche Unsichtbarmachen des Keyboards. In der Loginmaske setze ich bei den Eingabefeldern das OnEnter wie folgt:
Delphi-Quellcode:
Dadurch wird schon mal die Tastatur erstmalig sichtbar und dadurch wird in weiterer Folge der Scanvorgang erst richtig möglich.
procedure TForm1.Edit1Enter(Sender: TObject);
var FService: IFMXVirtualKeyboardService; begin TPlatformServices.Current.SupportsPlatformService(IFMXVirtualKeyboardService, IInterface(FService)); if (FService <> nil) then begin FService.ShowVirtualKeyboard(Edit1); Edit1.SetFocus; end; end; Das OnEnter aller Felder, die kein Keybord benötigen, bzw. wo es nicht angezeigt werden soll, sieht so aus:
Delphi-Quellcode:
Jedes dieser Eingabefelder bekommt aber einen Button, über den man das Keyboard anzeigen kann. Eventuell checke ich mal, ob das nicht besser über eine Hardwarteste des Scanners erledigt werden sollte. Dann halt im OnKeUp des Eingabefeldes.
procedure TForm1.Edit2Enter(Sender: TObject);
var FService: IFMXVirtualKeyboardService; begin TPlatformServices.Current.SupportsPlatformService(IFMXVirtualKeyboardService, IInterface(FService)); if (FService <> nil) then FService.HideVirtualKeyboard; TEdit (Sender).Tag := 0; end; Einstweilen aber mal so:
Delphi-Quellcode:
Funktioniert hervorragend so.
procedure TForm1.EditButton1Click(Sender: TObject);
var FService: IFMXVirtualKeyboardService; begin Edit2.Tag := abs (Edit2.Tag - 1); TPlatformServices.Current.SupportsPlatformService(IFMXVirtualKeyboardService, IInterface(FService)); if (FService <> nil) then begin if Edit2.Tag = 0 then FService.ShowVirtualKeyboard(Edit2) else FService.HideVirtualKeyboard; Edit2.SetFocus; end; end; Zumindest nach ersten kurzen Tests. |
AW: Problem mit Android Barcodescanner
Zitat:
Wenn es einen Hardwarebutton gibt, dann kann man diesen bestimmt auch via API/SDK ansprechen, bzw. ein Event dafür registrieren. |
AW: Problem mit Android Barcodescanner
Ja, aber leider ist die Doku des SDK etwas rudimentär gehalten bzw. kenne ich mich da zu wenig damit aus.
Meine andere Lösung funktioniert aber schon mal recht gut. Bin gerade am testen, ob es wirklich in allen Fällen so tut, wie ich will. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz