我创建了一个测试新的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本身)。
答案 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;