Delphi - Захват окна / формы, в которой находится текущий фокус

У меня есть приложение MDI с многочисленными дочерними элементами MDI (а также формами без MDI), и я хотел бы отслеживать, какая форма в настоящее время активирована и всегда находится в фокусе. Когда пользователь переключается с одной формы на другую в приложении, я хотел бы перехватить сообщение об активации окна и в фоновом режиме установить глобальную переменную на свойство активной формы (это свойство наследуется от базового класса). Первоначально я поместил код в обработчик события OnActivate для базового класса (который используют все формы в моем приложении), но заметил, что это событие не всегда возникает. Любые идеи?

Я использую Delphi 2006 BDS.


person PDM    schedule 27.06.2011    source источник
comment
Что именно вы имеете в виду под фокусом? Если вы имеете в виду фокус ввода, вы можете вызвать Windows.GetFocus, передать результат в FindControl и, наконец, пройти по родительской иерархии, пока не дойдете до формы.   -  person David Heffernan    schedule 27.06.2011
comment
@David: Я бы сказал, пока вы не найдете вершину иерархии (Parent = nil). Формы могут быть встроены во фреймы внутри форм внутри фреймов внутри форм ...   -  person Marjan Venema    schedule 27.06.2011
comment
другой момент, раскрытие меню не должно изменять фокус ввода или активную форму   -  person David Heffernan    schedule 27.06.2011
comment
Спасибо за ваш вклад, ребята, я отредактировал свой исходный вопрос, чтобы, надеюсь, сделать его менее расплывчатым ...   -  person PDM    schedule 29.06.2011


Ответы (2)


Глобальная переменная 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;
person NGLN    schedule 29.06.2011

Подходит ли вам свойство ActiveMDIChild?

person Birger    schedule 27.06.2011
comment
Спасибо за ваш вклад, ребята, я отредактировал свой исходный вопрос, чтобы, надеюсь, сделать его менее расплывчатым ... - person PDM; 29.06.2011