我有一个MDI应用程序,它有许多MDI子窗体(也是非MDI窗体),并且想要跟踪哪个窗体当前处于激活状态并始终处于焦点位置。当用户在应用程序中从一种窗体切换到另一种窗体时,我想捕获窗口激活消息,并在后台将全局变量设置为活动窗体的属性(此属性从基类继承)。我最初将代码放在基类的OnActivate事件处理程序中(我的应用程序中使用了所有表单),但是注意到这个事件并不总是会引发。有任何想法吗?德尔福 - 捕获当前焦点的窗口/窗体
我正在使用Delphi 2006 BDS。
我有一个MDI应用程序,它有许多MDI子窗体(也是非MDI窗体),并且想要跟踪哪个窗体当前处于激活状态并始终处于焦点位置。当用户在应用程序中从一种窗体切换到另一种窗体时,我想捕获窗口激活消息,并在后台将全局变量设置为活动窗体的属性(此属性从基类继承)。我最初将代码放在基类的OnActivate事件处理程序中(我的应用程序中使用了所有表单),但是注意到这个事件并不总是会引发。有任何想法吗?德尔福 - 捕获当前焦点的窗口/窗体
我正在使用Delphi 2006 BDS。
全球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;
您是什么意思焦点。如果您的意思是输入焦点,那么您可以调用Windows.GetFocus,将结果传递给FindControl,并最终遍历父层次结构,直到到达表单。 –
@David:我会说,直到你找到层次结构的顶部(Parent = nil)。表单可以嵌入框架内框架内的框架内... –
@Marjan好点。 –