FireMonkey:如何在vkReturn上将焦点集中到下一个控件?

4

这是一个经典的VCL问题,但如何在FireMonkey中实现呢?

我有几个标准的TControl可以获得焦点...

例如,在某些TEdit中,如果我按下回车键,我想移动到下一个可聚焦的控件。

我尝试了不同的方法,但都没有成功(例如将键、keychar替换为13时的9,...,将键事件转发给表单等)。

当然,由于它是FMX,我希望有一个适用于所有平台的解决方案...

如果它可以避免以下情况:

  • 浏览父级的Children属性
  • 使用不同的代码来处理不同的平台
  • 硬编码tab顺序
  • ...,那就太好了;o)
2个回答

10

您可以将以下代码放在窗体的OnKeyDown事件中:

  if Key = vkReturn then begin
    Key := vkTab;
    KeyDown(Key, KeyChar, Shift);   
  end;

如果你只想让某些控件具有这种行为,那么你必须在这些控件的 OnKeyDown 事件中调用此代码。

请注意,KeyDown 必须调用 TForm.KeyDown 才能使其工作。

(已在 XE2 中测试)


我错过了KeyDown过程...调用事件没有触发它!你的代码完全符合我的愿望!谢谢 - Whiler
当下一个“Edit”出现不同的“ReturnKeyType”时,该如何处理? - Machado
这个程序可以跨平台使用吗? - George Birbilis

1
除了建议的答案外,要通过编程方式移动到下一个控件,可以使用TFMXControlClassHelper提供的SelectNext方法,该方法位于以下位置:

https://codeverge.com/embarcadero.delphi.firemonkey/fmx-how-to-programmatically-mov/2031600

它使用GetTabList(返回ITabList接口)和FindNextTabStop(返回IControl接口)以及SetFocus。
根据https://stackoverflow.com/a/36715134/903783,“Firemonkey框架禁止在某些事件中更改焦点。为了更改焦点,请向窗体发送延迟消息。”(指的是TabControl的TabChange事件,在其中处理程序似乎不能使用SetFocus来聚焦子控件)。因此,请参阅该处以获取更安全的“SetFocus”方法。

不幸的是,第一个链接似乎已经失效,在archive.org上无法访问(也许在Google缓存或其他档案中?),但是https://codeverge.com/embarcadero.delphi.firemonkey仍然有效,因此可以在那里搜索。 - George Birbilis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接