Lancer un event sans le conna�tre
Bonjour � toutes et tous
Je suis en train de faire un composant WPF (un poil de C# et beaucoup de C++/CLI) qui encapsule des librairie C++.
Cot� C++, nous avons un syst�me de notification interne bas� sur des callbacks. Je voudrais que ces notifications soient accessibles dans l'interface via l'envoi d'event manag� classique (le but est que les utilisateurs du composant ne voient pas le code non manag�)
Sauf que j'aimerais �viter d'�crire un m�canisme g�n�rique auquel on file le type de notification, la classe d'argument de l'event CLI et qu'il transforme l'un en l'autre tout seul. Et je bloque sur deux points :
- Pas le droit aux pointeurs de fonction sur une classe manag�e
- Pas possible de d�clar� un event depuis une classe non manag�
J'�tais donc parti sur une classe template mais je n'arrive pas a utiliser un type d'event et/ou delegate en param�tre de template ... (ce qui me semble logique)
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
public ref class CkstClrKineoControl : public System::Windows::Controls::Control
{
public:
delegate void SelectionDidChangeDelegate(CkstClrNotificationSelection^ i_selection);
SelectionDidChangeDelegate^ SelectionDidChangeEvent;
event SelectionDidChangeDelegate^ SelectionDidChangeEventHandler
{...} // add, remove & raise
private:
CkstClrNotificator<CkstClrNotificationSelection, SelectionDidChangeDelegate>* m_notificator;
}
CkstClrKineoControl::CkstClrKineoControl()
{
m_notificator = new CkstClrNotificator <CkstClrNotificationSelection, SelectionDidChangeDelegate> (CkitNotificator::defaultNotificator(), CkppSelection::DID_CHANGE, SelectionDidChangeEvent);
} |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
template < typename clrNotificationClass, typename eventClass >
class CkstClrNotificator
{
public:
inline CkstClrNotificator(const CkitNotificatorShPtr& i_notificator, CkitNotification::TType i_type, eventClass^ i_event):
m_type(i_type),
m_event(i_event)
{
i_notificator->subscribe< CkstClrNotificator >(m_type, this, &CkstClrNotificator::notificationReciever);
}
inline virtual ~CkstClrNotificator()
{
CkitNotificator::defaultNotificator()->unsubscribe(m_type, this);
}
inline void notificationReciever(const CkitNotificationConstShPtr& i_notification)
{
CkstClrNotificationSelection^ clrSelection = gcnew clrNotificationClass(i_notification);
m_event->Invoke(clrSelection);
}
private:
CkitNotification::TType m_type;
gcroot<eventClass^> m_event;
}; |
Bon �a marche pas, mais c'est le seul truc que j'arrive � faire compiler :)
Donc je cherche soit a corriger cette m�thode, soit une autre m�thode ou je pourrais transformer mes notifications en event manag� sans avoir a �crire une classe sp�cifique non manag� et une fonction manag� sp�cifique pour faire envoy� l'event, ceci par type de notification a envoyer