Delphi Firemonkey Frames - 如何获取帧使用的事件 OnEnter 和 OnExit

Delphi Firemonkey Frames - How to get the event OnEnter and OnExit of the usage of a frame

使用 Delphi 东京和 FireMonkey: 我在表单上有很多不同的框架,并且想设置一些表单级变量,因为关注表单在不同框架内外的变化。 前任。我在表单上有一个插入按钮,如果用户所在的框架允许插入,我想启用它,然后在离开框架的焦点时再次禁用它。 框架上有 OnEnter 和 OnExit 事件,但它们从不执行。 很明显在框架上有编辑等。

框架无法接收焦点,因此它们不会触发 OnEnter()OnExit() 事件。

在窗体上放置框架后,您可以为所有编辑控件(或框架上的其他输入控件)创建两个通用事件处理程序

procedure TForm14.Frame112EditExit(Sender: TObject);
begin
  Button1.Enabled := False;
end;

procedure TForm14.Frame112EditEnter(Sender: TObject);
begin
  Button1.Enabled := True;
end;

和link所有这些编辑控件的OnEnter()OnExit()事件到这两个事件处理程序。

我不确定当从一个编辑控件移动到另一个编辑控件时事件是否以正确的顺序触发,但是一个简短的测试(在 Windows 上)表明我们留下的控件的 OnExit() 是正如预期的那样,在我们输入的控件 OnEnter() 之前触发。

type
  TForm1 = class(TForm)
    Label1: TLabel;
    procedure FormFocusChanged(Sender: TObject);
  private
    FFocusedFrame: TFrame;
  public
    { Public declarations }
  end;

...

procedure TForm1.FormFocusChanged(Sender: TObject);
var
  LParent: TFmxObject;
begin
  if Focused <> nil then
  begin
    LParent := Focused.GetObject.Parent;
    while (LParent <> nil) and not (LParent is TFrame) do
      LParent := LParent.Parent;
    if (LParent <> nil) and (FFocusedFrame <> LParent) then
    begin
      FFocusedFrame := TFrame(LParent);
      Label1.Text := FFocusedFrame.Name;
    end;
  end;
end;

end.

无需为每个控件连接 OnEnter 和 OnExit