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;
我创建了一个测试新的 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;