Delphi FMX编辑控制不一致 - 如何制作快速输入表格?

时间:2016-05-07 15:25:10

标签: delphi firemonkey

我编写了一个Delphi FMX表单,用于在Android应用上输入数据。这包括几个垂直排列并与水平中心对齐的控件。控件也全部放在TVertScrollBox上,因此控件可以滚动到(和退出)视图中。有一些TEdits,2个TComboboxes和1个TComboEdit。我还在表单中添加了以下代码

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;

现在这对于TEdit控件非常有效,因为用户可以使用回车键(通常我将TEdit.ReturnKeyType属性设置为Next)来导航控件列表,为每个控件列表输入数据并点击输入将焦点移动到下一个焦点的关键。

这里有两个问题。

  1. 一旦控件是TCombobox,虚拟键盘就会消失。换句话说,TCombobox上没有.keyboardtype.ReturnKeyType属性。因此,在从下拉列表中选择组合框的条目后,他们必须"到达"并手动选择下一个控件。他们常常想念。

  2. TEditCombo确实是一个奇怪的后代。它具有.Keyboardtype属性,但它没有.ReturnKeyType属性。这让我的用户非常困惑,因为尽管他们可以键入这个组合框,但返回键并不能说" Next"当此控件具有焦点时,就像在TEdits上一样。

  3. 如何让此表单上的所有控件显示键盘并显示"返回键"无论当前控件的类型或下一个控件的类型如何,都会移动到下一个控件?

    我有幸使用VCL编写了Windows应用程序吗?

1 个答案:

答案 0 :(得分:1)

在Comboboxes和TComboEdits上,添加以下事件处理程序:

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;

它的工作原理如下:

当组合框获得焦点时,它会立即下降。

用户从下拉列表中选择一个项目后,会立即显示键盘并将其返回键显示更改为&#34;下一步&#34;。

组合框的keydown事件处理程序似乎拦截了返回键,因为在FMX表单中没有.keypreview属性,所以它有自己的事件处理程序到&#34;改变&#34;选项卡键的返回键,以便下一个控件(按Tab键顺序)获得焦点。

当组合框退出(从)时,键盘被隐藏。

我从FMX.Edit.pas单元中抄袭了SendMessage代码。它似乎有效。