Гибкий метод обнаружения изменения сфокусированного элемента управления

Мне нужно написать компонент, который будет регистрировать в себе другие компоненты и определять, получит ли фокус один из зарегистрированных компонентов.

Например, для моего компонента TFicusObserverя регистрирую три объекта.

FocusObserver.Register(MyMemo);
FocusObserver.Register(MyButton);
FocusObserver.Register(MyEdit);

И теперь, если один из этих компонентов получает фокус, то FocusObserverзапускает какое-то событие уведомления.

Я искал, как обнаружить изменение фокуса, и обнаружил, что TScreen.OnActiveControlChange— это именно то, что мне нужно. Так что мой компонент может подключиться к этому событию. Проблема в том, что может существовать более одного TFocusObserverили позже в будущем кто-то может захотеть использовать OnActiveControlChange.

Это время, когда я бы выиграл от многоадресной рассылки — это сразу решило бы мою проблему.

Я думал, как решить эту проблему, и в настоящее время у меня есть две идеи:

  1. Как-то расширить TScreen, чтобы он предоставил мне еще одно событие.
  2. Введите промежуточный объект, который будет подключаться к OnActiveControlChangeи предоставлять одно многоадресное событие для других объектов.

После краткого просмотра исходников у меня нет ясного представления, как решить эту проблему, используя первую идею, а вторая идея имеет тот недостаток, что кто-то может просто назначить другой метод для OnActiveControlChange, и все развалится. .

Буду признателен за некоторые предложения.

6
задан Wodzu 25 June 2012 в 11:40
поделиться