【问题标题】:Delphi - Capturing the Window/Form which has current focusDelphi - 捕获具有当前焦点的窗口/窗体
【发布时间】:2011-09-23 15:51:50
【问题描述】:

我有一个包含多个 MDI 子项(以及非 MDI 表单)的 MDI 应用程序,我想跟踪哪个表单当前处于激活状态并始终具有焦点。当用户在应用程序中从一种形式切换到另一种形式时,我想捕获窗口激活消息,并在后台将全局变量设置为处于活动状态的表单属性(此属性继承自基类)。我最初将代码放在基类的 OnActivate 事件处理程序中(我的应用程序中的所有表单都使用它),但我注意到这个事件并不总是被引发。有任何想法吗?

我正在使用 Delphi 2006 BDS。

【问题讨论】:

  • 专注是什么意思。如果您的意思是输入焦点,那么您可以调用 Windows.GetFocus,将结果传递给 FindControl,最后向上遍历父层次结构,直到到达一个表单。
  • @David:我会说,直到您找到层次结构的顶部(父级 = nil)。表单可以嵌入在表单中的框架内的框架内...
  • 另外一点,下拉菜单不应该改变输入焦点或活动表单
  • 感谢您的意见,我已经编辑了我原来的问题,希望能使它不那么含糊...

标签: delphi vcl tform


【解决方案1】:

全局Screen 变量跟踪所有表单。 Screen.ActiveCustomForm 指向具有焦点的表单,Screen.OnActiveFormChange 是每次焦点更改为另一个表单时触发的事件。您可以在其事件处理程序中更新您的属性:

type
  TMainForm = class(TForm)
    ...
  private
    procedure ActiveFormChanged(Sender: TObject);
  end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  Screen.OnActiveFormChange := ActiveFormChanged;
end;

procedure TMainForm.ActiveFormChanged(Sender: TObject);
begin
  { Do what you want to do }
end;

【讨论】:

    【解决方案2】:

    ActiveMDIChild 属性是您要查找的吗?

    【讨论】:

    • 感谢您的意见,我已经编辑了我原来的问题,希望能使它不那么含糊...
    猜你喜欢
    • 2012-06-07
    • 2018-11-14
    • 2011-08-18
    • 2018-05-03
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    相关资源
    最近更新 更多