Ответ 1
Я реализовал решение для этого, которое работает практически с любой версией Delphi - оно было первоначально реализовано в Delphi 7, хотя я не тестировал его в более ранних версиях (но если вы используете Delphi 7 самостоятельно, все, что вам нужно знать, верно?).:)
iirc это было, по крайней мере, частично вдохновением для поста Аллена Бауэра. Вы можете увидеть мою реализацию, продемонстрированную в некоторых видео, и загрузить код из моего блога:
Сообщения, которые вас интересуют, отмечены как "multicast". Ссылка для загрузки для окончательного кода доступна в этом сообщении.
В моем подходе вы получаете класс из TMultiCastEvent. Весь ваш производный класс должен сделать, это реализовать некоторую простую защиту безопасности типа для добавления, удаления и вызова события с определенной сигнатурой.
Реализация для TNotifyEvent - procedure (Sender: TObject) - обеспечивается реализацией как "для вас" (наиболее часто используемые "многоадресные события" - это простые уведомления), а также как пример получения многоадресного события классы для специальных сигнатур событий.
Когда у вас есть класс событий многоадресной рассылки, вы можете использовать обычные "обработчики событий" взаимозаменяемо с версией с несколькими листами, например. учитывая некоторый воображаемый класс кнопок с многоликим событием On_Click (я принял соглашение о промежуточном подчеркивании имени события, чтобы идентифицировать его как многоадресную рассылку, а также регулярные события "uni-cast" ):
Код, который назначает обработчик событию одноадресного клика:
Button.OnClick := MyClickHandler;
Можно напрямую добавить тот же обработчик к событию Notify Multiple:
MultiCastButton.On_Click.Add(MyClickHandler);
Моя реализация также включает в себя ряд усовершенствований, таких как возможность отключения событий и автоматическое удаление обработчиков из обработчиков при уничтожении объекта реализации (это связано с небольшим количеством домашнего хозяйства, которое может быть проигнорировано, если необходимо, но которое может быть полезно при определенных обстоятельствах).
Все это описано и продемонстрировано в моих сообщениях в блоге.
Enjoy.:)