2011-06-27 52 views
2

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

我正在使用Delphi 2006 BDS。

+0

您是什么意思焦点。如果您的意思是输入焦点,那么您可以调用Windows.GetFocus,将结果传递给FindControl,并最终遍历父层次结构,直到到达表单。 –

+2

@David:我会说,直到你找到层次结构的顶部(Parent = nil)。表单可以嵌入框架内框架内的框架内... –

+0

@Marjan好点。 –

回答

3

全球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; 
5

ActiveMDIChild属性是你在找什么?

+0

感谢您的输入的家伙,我编辑了我的原问题,希望能让它不那么模糊...... – PDM