如何捕获Firemonkey中的活动控件?

How to capture the active control in Firemonkey?

我正在将 VCL 应用程序迁移到 FMX。我需要知道具有焦点的控件的 class。该应用程序使用具有大量输入控件的各种动态创建的框架。
在 VCL 中,我使用 VCL.Forms.TScreen.OnActiveControlChange 因为这是始终捕获活动控件的一个地方。此事件在 FMX.Forms.TScreen 中不可用。 FMX 中的替代方法是什么?

FMX 中最相似的方法是收听 TForm.OnFocusChanged event. From within the event handler you could then look up theTForm.Focused 属性。

可悲的是,在 Delphi 10.3 中,@iamjoosy 概述的方法在某些情况下因 'Access Violation' 而失败(尤其是当 TabControls / TabItems 用作其他控件的容器时)。

我使用的代码:

procedure TForm1.FormFocusChanged(Sender: TObject);

var

Control : iControl;
MyControl : TFMXObject;

begin

  Control := form1.focused;

  try

      MyControl := TFmxObject(Control.GetObject);
      form1.Caption := MyControl.Name + ' of type ' + MyControl.ClassName;

  finally

    MyControl := nil;
    Control := nil;

  end;

end;

然而,为了增加一些阴谋,上述方法在以下情况下恢复正常工作:

1) 没有 TabControl/TabItem 个对象

2) 如果我将以下事件处理程序添加到每个子按钮(例如,将焦点设置回其父 TabItem):

procedure TForm1.Button2Click(Sender: TObject);
begin

  TabItem1.SetFocus;

end;

希望有人可以就我是否在做一些愚蠢的事情,或者我是否 运行 陷入了 FMX 错误提供建议。