2009-09-08 2 views
13

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

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

ответ

10

Я реализовал решение, которое работает практически в любой версии Delphi - оно было первоначально реализовано в Delphi 7, хотя я не тестировал его в более ранних версиях (но если вы используете Delphi 7 самостоятельно, это все, что вам нужно знать, верно?). :)

iirc это было по крайней мере частично вдохновением для сообщения Аллена Бауэра. Вы можете увидеть мою реализацию, продемонстрированную в некоторых видеороликах, и загрузить код from my blog:

Сообщения, которые вас интересуют, отмечены как «multicast». Ссылка для загрузки для окончательного кода: available in this post.

В моем подходе вы получаете класс из TMultiCastEvent. Весь ваш производный класс должен сделать, это реализовать простую защиту безопасности типа для добавления, удаления и вызова события с определенной подписью.

Реализация для TNotifyEvent - процедура (отправитель: TObject) - обеспечивается реализацией как «для вас» (наиболее часто используемые «многоадресные события» - это простые уведомления), а также как пример получения многоадресной рассылки классы событий для специальных сигнатур событий.

Как только у вас есть класс событий многоадресной рассылки, вы можете использовать обычные «обработчики событий» взаимозаменяемо с версией с несколькими листами, например. учитывая некоторый воображаемый кнопочный класс с многоликим событием On_Click (я принял соглашение о подстановке подчеркивания в имени события, чтобы идентифицировать его как многоадресную рассылку, а также регулярные события «uni-cast»):

Код, который присваивает обработчик одноадресному события щелчка:

Button.OnClick := MyClickHandler; 

Можно напрямую добавить тот же обработчик для нескольких актеров Уведомлять событие:

MultiCastButton.On_Click.Add(MyClickHandler); 

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

Все это описано и продемонстрировано в моих сообщениях в блоге.

Наслаждайтесь. :)

+2

+1; BTW: Это список ваших многостраничных событий: http://www.deltics.co.nz/blog/?tag=multicast-events –

+0

спасибо за ваши усилия, но почему бы вам не опубликовать образец для показа как это использовать? – FLICKER

2

Allen Bauer имеет a blog post about multicast events, что может быть полезно. Тем не менее, он работает только для Delphi 2009 или позже.

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

+0

К сожалению, я использую D7 Personal ... Я плохой студент;) Не могу позволить себе D2009 ... – migajek

+0

Я вас слышу. Мне бы очень хотелось увидеть личный выпуск D2009, но, по-видимому, его выпуск слишком сильно сократил продажи Delphi Professional, и, в отличие от Microsoft, Embarcadero не имеет огромных отделов без дебюта, которые приносят деньги, чтобы субсидировать это. –

+3

Вопрос в долгосрочной перспективе: «Может ли Embarcadero позволить НЕ иметь дешевую версию для« бедных студентов »и любителей» –

1

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

+0

На самом деле я знаю, что patter, хотя я и не знал, что это имя;) В любом случае мне нужна какая-то автоматизация при интеграции с VCL. У меня много типов управления, которые мне нужно поймать ... – migajek

Смежные вопросы