Delphi FMX 将焦点设置到特定控件以便出现光标

Delphi FMX set focus to a particular control so the cursor appears

我创建了一个测试新的 FMX 项目。向其添加了一个 TabControl。使用上下文菜单添加 3 个标签页。在第三个标签表中,添加了一个 TEdit。向选项卡控件添加了 OnChangeEvent 处理程序。编码如下:

procedure TForm1.TabControl1Change(Sender: TObject);
begin
  if TabControl1.ActiveTab = TabItem3 then
  begin
    self.ActiveControl := Edit1;
    self.Focused := Edit1;
    Edit1.SetFocus;
  end;
end;

如你所见,我根据我以前的VCL经验尝试了各种组合。 input/cursor 焦点不会通过代码更改为 Edit1。当然,在 Win32 运行时,如果我单击 edit1,焦点矩形(我使用的是样式)现在会像光标一样显示。 (如预期)在 Android。只有当我自己转移焦点时,VK 才会出现。

有没有办法以编程方式执行此操作,以便用户可以开始输入? (无需将焦点转移到 TEdit 本身)。

firemonkey 框架禁止在某些事件中改变焦点。

为了改变焦点,向表单发送延迟消息。

这可以通过匿名线程完成:

procedure TForm1.TabControl1Change(Sender: TObject);
begin
  if TabControl1.ActiveTab = TabItem3 then
  begin
    TThread.CreateAnonymousThread(
      procedure
      begin
        TThread.Synchronize( nil,
          procedure
          begin
            Edit1.SetFocus;
          end
        );
      end
    ).Start;
  end;
end;

要使其更通用,请使用专用程序:

procedure DelayedSetFocus(control : TControl);
begin
  TThread.CreateAnonymousThread(
    procedure
    begin
      TThread.Synchronize( nil,
         procedure
         begin
           control.SetFocus;
         end
      );
    end
  ).Start;
end;

在 XE6 中,建议的代码仅在我在第二行程序之后添加开始时有效:

procedure DelayedSetFocus(control : TControl);
begin
  TThread.CreateAnonymousThread(
    procedure
    begin
      TThread.Synchronize( nil,
         procedure
         begin
           control.SetFocus;
         end
      );
    end
  ).Start;
end;