Delphi FMX将焦点设置为特定控件,以便显示光标

nol*_*ker 2 delphi firemonkey

我创建了一个测试新的FMX项目.添加了TabControl.使用上下文菜单添加3个选项卡.在第3个标签页中添加了一个TEdit.为tabcontrol添加了OnChangeEvent处理程序.编码如下:

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

如您所见,我根据之前的VCL体验尝试了各种组合.输入/光标焦点不会通过代码更改为Edit1.当然,在Win32的运行时,如果我点击edit1,焦点矩形(我正在使用一种样式)现在就像光标一样显示.(正如预期的那样)在Android上.当我自己转移焦点时,VK才出现.

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

LU *_* RD 7

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;
Run Code Online (Sandbox Code Playgroud)

为了使其更通用,请使用专用程序:

procedure DelayedSetFocus(control : TControl);
begin
  TThread.CreateAnonymousThread(
    procedure
    begin
      TThread.Synchronize( nil,
         procedure
         begin
           control.SetFocus;
         end
      );
    end
  ).Start;
end;
Run Code Online (Sandbox Code Playgroud)