Подтвердить что ты не робот

Delphi VCL для Win32 - несколько обработчиков событий

Я ищу некоторый код, позволяющий легко назначать много обработчиков событий для одного события объекта... Мне это очень нужно для моей архитектуры плагина, поэтому я внедрил некоторую замену для этого, однако мне не нравится мой решение для этого, поэтому я хотел бы знать, что ваша идея/решение/подсказка... Мое решение - это просто список с такими элементами, как eventName: string; proc: TMyEventProc; где TMyEventProc принимает два аргумента, отправитель и eventData: указатель. в зависимости от имени события, eventData указывает на другую запись/объект.

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

4b9b3361

Ответ 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.:)

Ответ 2

Allen Bauer сообщение в блоге о событиях многоадресной передачи, которые могут быть полезны. Он работает только для Delphi 2009 или более поздних версий.

EDIT: если вы все еще на D7, вы все равно сможете сделать эту работу, если вам не нужно слишком много разных сигнатур событий. Попробуйте взглянуть на код Аллена и посмотреть, можете ли вы адаптировать его к универсальному решению.

Ответ 3

Если вы внедряете систему плагинов, я думаю, вы не можете просто уйти с обработчиками событий - будь то многоадресная рассылка или нет. Я предлагаю взглянуть на шаблон наблюдателя. Может показаться немного слишком многословным рядом с событиями многоадресной передачи, но по крайней мере более гибким, когда вам нужно.