2016-05-07 4 views
3

Ich habe ein Delphi FMX-Formular zur Dateneingabe in einer Android-App programmiert. Diese besteht aus mehreren vertikal angeordneten und mit horizontalen Zentren ausgerichteten Kontrollen. Die Steuerelemente sind auch alle auf einer TVertScrollBox platziert, so dass die Steuerelemente in (und aus) Ansicht gescrollt werden können. Es gibt ein paar TEdits, 2 TComboboxes und 1 TComboEdit. Ich habe auch den folgenden Code zu meiner FormDelphi FMX-Bearbeitung steuert Inkonsistenzen - Wie erstellt man ein Schnelleingabeformular?

procedure TfrmMain.FormKeyDown(Sender: TObject; var Key: Word; 
    var KeyChar: Char; Shift: TShiftState); 
begin 
    if Key = vkReturn then 
    begin 
    Key := vkTab; 
    KeyDown(Key, KeyChar, Shift); 
    end; 
end; 

Nun hat dieses sagenhaft für die TEdit Kontrollen in das funktioniert kann der Benutzer die Enter-Taste verwenden (in der Regel stelle ich die TEdit.ReturnKeyType Eigenschaft auf Next), um die Liste der Steuerelemente zu navigieren Geben Sie für jeden Daten ein und drücken Sie die Eingabetaste, um den Fokus auf den nächsten zu verschieben.

Es gibt 2 Probleme hier.

  1. Sobald die Steuerung eine TCombobox ist, verschwindet die virtuelle Tastatur. Mit anderen Worten, es gibt keine .keyboardtype oder .ReturnKeyType Eigenschaft auf einer TCombobox. Nach dem Auswählen eines Eintrags für die Combobox aus der Dropdown-Liste müssen sie also "eingreifen" und das nächste Steuerelement manuell auswählen. Oft vermissen sie.

  2. Der TEditCombo ist in der Tat ein merkwürdiger Abkömmling. Es hat eine .Keyboardtype Eigenschaft, aber es hat keine .ReturnKeyType Eigenschaft. Das hat meine Benutzer sehr verwirrt, denn obwohl sie in diese Combobox eingeben können, sagt der Return-Schlüssel nicht "Weiter", wenn dieses Steuerelement den Fokus hat, wie es bei den TEdits der Fall ist.

Wie kann ich alle Steuerelemente auf diese Form der Tastatur zeigen und haben die „Return-Taste“, um die nächste Steuer bewegen, unabhängig von der Art der Stromsteuerung oder die nächste?

War ich privilegiert, Windows-Apps mit der VCL programmiert zu haben?

Antwort

1

Auf der Comboboxen und TComboEdits, fügen Sie die folgenden Event-Handler:

procedure TForm1.ComboBox1CanFocus(Sender: TObject; var ACanFocus: Boolean); 
begin 
    Combobox1.DropDown; 
end; 

procedure TForm1.ComboBox1Exit(Sender: TObject); 
var 
    keyboard: IFMXVirtualKeyboardService; 
begin 
    keyboard := TPlatformServices.Current.GetPlatformService(IFMXVirtualKeyboardService) as IFMXVirtualKeyboardService; 
    if keyboard.HideVirtualKeyboard then 
    Label1.text := 'hidden'; 
end; 

procedure TForm1.ComboBox1KeyDown(Sender: TObject; var Key: Word; 
    var KeyChar: Char; Shift: TShiftState); 
begin 
    label1.Text := IntToStr(Key); 
    if Key = vkReturn then 
    begin 
    Key := vkTab; 
    KeyDown(Key, KeyChar, Shift); 
    end; 
end; 

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; 
    Shift: TShiftState); 
begin 
    label1.Text := IntToStr(Key); 
    if Key = vkReturn then 
    begin 
    Key := vkTab; 
    KeyDown(Key, KeyChar, Shift); 
    end; 
end; 

procedure TForm1.ComboBox1ClosePopup(Sender: TObject); 
var 
    keyboard: IFMXVirtualKeyboardService; 
    MS: TmessageSender; 
begin 
    keyboard := TPlatformServices.Current.GetPlatformService(IFMXVirtualKeyboardService) as IFMXVirtualKeyboardService; 
    if keyboard.showVirtualKeyboard(ComboBox1) then 
    Label1.Text := 'Shown'; 
    MS := tmessageSender.Create; 
    try 
    Ms.SendMessage<TReturnKeyType>(MM_EDIT_RETURNKEYTYPE_CHANGED, TReturnKeyType.Next); 
    finally 
    MS.Free; 
    end; 
end; 

Es funktioniert wie folgt:

Wenn der Combobox den Fokus erhält, fällt es sofort.

Unmittelbar nachdem der Benutzer ein Element aus der Dropdown-Liste ausgewählt hat, wird die Tastatur angezeigt und die Anzeige der Rückkehrtaste wird auf "Weiter" geändert.

Der Keydown-Event-Handler der Combobox scheint den Return-Schlüssel abzufangen, da es keine .keypreview -Eigenschaft in FMX-Formularen gibt, also hat er seinen eigenen Event-Handler, um den Return-Key zu einem Tab-Key zu ändern Kontrolle (in Tab-Reihenfolge) bekommt den Fokus.

Wenn die Combobox beendet wird (von), wird die Tastatur ausgeblendet.

Ich habe den SendMessage-Code von der FMX.Edit.pas-Einheit gelesen. Es scheint zu funktionieren.