2009-09-08 23 views
13

Poszukuję kodu umożliwiającego łatwe przypisywanie wielu programów obsługi zdarzeń do pojedynczego zdarzenia obiektu ... Bardzo potrzebowałem go do architektury wtyczki, więc zaimplementowałem zastępstwo dla tego jednak nie podoba mi się moje rozwiązanie, dlatego chciałbym wiedzieć, jaki jest twój pomysł/rozwiązanie/wskazówka ... Moim rozwiązaniem jest lista z takimi obiektami, jak eventName: string; proc: TMyEventProc; gdzie TMyEventProc pobiera dwa argumenty, nadawca i eventData: wskaźnik. w zależności od nazwy zdarzenia, eventData wskazuje na inny rekord/obiekt.Delphi VCL for Win32 - wiele programów obsługi zdarzeń

Niestety, wymaga to podania wielu, wielu zapisów, które można uznać za argument. Metoda jest również bardzo powolna i wymaga implementacji wywołania wymaganych "wywołań zwrotnych", podczas gdy "prawdziwe" wydarzenie zostaje trafione.

Odpowiedz

10

Zaimplementowałem rozwiązanie, które działa w niemal każdej wersji Delphi - zostało pierwotnie zaimplementowane w Delphi 7, chociaż nie testowałem go we wcześniejszych wersjach (ale jeśli używasz Delphi 7, to to wszystko, co musisz wiedzieć, prawda?). :)

Iirc była to przynajmniej część inspiracji dla postu Allena Bauera. Moją implementację pokazano na niektórych filmach i pobierz kod: from my blog:

Posty, które Cię interesują, są oznaczone jako "multicast". Link do pobrania końcowego kodu to available in this post.

W moim podejściu wywodzisz klasę z TMultiCastEvent. Cała twoja klasa pochodna musi zrobić to implementacja prostego zabezpieczenia typu dla dodawania, usuwania i wywoływania zdarzenia z określonym podpisem.

Implementacja dla TNotifyEvent - procedura (nadawca: TObject) - jest dostarczana wraz z implementacją zarówno "abyś mógł działać" (najbardziej przydatne "zdarzenia multiemisji są prostymi powiadomieniami), jak również jako przykład uzyskiwania multiemisji klasy zdarzeń dla określonych sygnatur zdarzeń.

Po utworzeniu klasy zdarzenia multiemisji można używać regularnie "procedur obsługi zdarzeń" z wersją dla wielu rzutów, np. biorąc pod uwagę jakąś wyimaginowaną klasę przycisków z zdarzeniem z wieloma kliknięciami On_Click (przyjąłem konwencję wstawiania podkreślenia w nazwie zdarzenia, aby zidentyfikować to jako multicast, w stosunku do zwykłych zdarzeń "uni-cast"):

Kod, który przypisuje handler do unicast kliknij zdarzenie:

Button.OnClick := MyClickHandler; 

można bezpośrednio dodawać ten sam program obsługi do grupowej Informuj zdarzenie:

MultiCastButton.On_Click.Add(MyClickHandler); 

Moja realizacja obejmuje również szereg udoskonaleń, takich jak zdolność do wyłączaj zdarzenia i automatycznie uruchamiaj procedury obsługi przeniesiony z modułów obsługi, gdy obiekt implementujący jest zniszczony (wymaga to niewielkiej ilości czynności porządkowych, które można w razie potrzeby zignorować, ale które mogą być przydatne w pewnych okolicznościach).

Wszystko to jest opisane i zademonstrowane na moich blogach.

Ciesz się. :)

+2

+1; BTW: Oto lista twoich wiadomości z wieloma zgłoszeniami: http://www.deltics.co.nz/blog/?tag=multicast-events –

+0

dzięki za wysiłek, ale dlaczego nie publikujesz próbki do pokazania Jak tego użyć? – FLICKER

2

Allen Bauer ma a blog post about multicast events, które mogą być pomocne. Działa to jednak tylko w Delphi 2009 lub później.

EDYCJA: Jeśli nadal korzystasz z D7, możesz nadal działać, jeśli nie potrzebujesz zbyt wielu różnych sygnatur zdarzeń. Spróbuj spojrzeć na kod Allena i sprawdź, czy możesz go dostosować do nietypowego rozwiązania.

+0

Niestety, używam D7 Personal ... Jestem biednym studentem;) Nie stać mnie na D2009 ... – migajek

+0

Słyszę cię. Naprawdę chciałbym też zobaczyć osobistą edycję D2009, ale wydaje się, że zwolnienie jednego z nich zbytnio wpłynęłoby na sprzedaż Delphi Professional, a w przeciwieństwie do Microsoftu, Embarcadero nie ma wielkich oddziałów spoza firmy deweloperskiej, które przynoszą pieniądze, aby to subsydiować. –

+3

Na dłuższą metę pytanie brzmi: "Czy Embarcadero może sobie pozwolić na NIE mieć taniej wersji dla" biednych studentów "i hobbystów" –

1

Jeśli wdrażasz system wtyczek, myślę, że nie można po prostu uciec z obsługą zdarzeń - czy to multicast, czy nie. Proponuję rzucić okiem na observer pattern. Może wydawać się zbyt gadatliwa w pobliżu zdarzeń multiemisji, ale co najmniej bardziej elastyczna, gdy jest taka potrzeba.

+0

faktycznie wiem, że tupot, mimo że nie znałem jego nazwy;) w każdym razie potrzebuję jakiejś automatyzacji podczas integracji z VCL. Mam wiele typów kontrolek, które zdarzenia muszę przechwycić ... – migajek

Powiązane problemy