如何捕获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 错误提供建议。
我正在将 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 错误提供建议。