Einzelnen Beitrag anzeigen

helste

Registriert seit: 16. Jul 2009
72 Beiträge
 
Delphi 10.1 Berlin Professional
 
#23

AW: Problem mit Android Barcodescanner

  Alt 17. Jan 2017, 11:07
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:
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;
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.

Code:
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;
Im OnEnter setze ich Tag immer auf 0;

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:
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;
Das funktioniert so, ist aber nicht befriedigend, da es nicht sehr schön ist, wenn das Keyboard kurz angezeigt wird.
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.
  Mit Zitat antworten Zitat