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

时间:2016-04-19 09:13:20

标签: 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;

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

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

2 个答案:

答案 0 :(得分:6)

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;

答案 1 :(得分:0)

在XE6中,建议的代码仅在我在第二行程序后添加一个开头时才起作用:

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