Visual C++ .NET/Delegate/Event
Содержание
Event firer and handler
<source lang="csharp">
- include "stdafx.h"
using namespace System; ref class MyEventArgs : EventArgs {
public: property String^ Info; MyEventArgs(String^ info) { Info = info; }
}; delegate void MyEventHandler(Object^ sender, MyEventArgs^ args); ref class EventSender {
public: event MyEventHandler^ MyEvent; void Fire(MyEventArgs^ args) { MyEvent(this, args); }
};
ref class EventReceiver {
public: void OnMyEvent(Object^ sender, MyEventArgs^ args) { Console::WriteLine("My Event with info: " + args->Info ); } void SetUpToReceive(EventSender^ sender) { sender->MyEvent += gcnew MyEventHandler(this, &EventReceiver::OnMyEvent); }
};
int main() {
EventReceiver^ receiver = gcnew EventReceiver(); EventSender^ sender = gcnew EventSender(); receiver->SetUpToReceive(sender); MyEventArgs^ myargs = gcnew MyEventArgs("abc"); sender->Fire(myargs);
}
</source>
event type
<source lang="csharp">
- include "stdafx.h"
using namespace System; ref class MyEventArgs : EventArgs {
public: property String^ Info; MyEventArgs(String^ info) { Info = info; }
}; delegate void MyEventHandler(Object^ sender, MyEventArgs^ args); ref class EventSender {
public: event MyEventHandler^ MyEvent; void Fire(MyEventArgs^ args) { MyEvent(this, args); }
};
ref class EventReceiver {
public: void OnMyEvent(Object^ sender, MyEventArgs^ args) { Console::WriteLine("My Event with info: " + args->Info ); } void SetUpToReceive(EventSender^ sender) { sender->MyEvent += gcnew MyEventHandler(this, &EventReceiver::OnMyEvent); }
};
int main() {
EventReceiver^ receiver = gcnew EventReceiver(); EventSender^ sender = gcnew EventSender(); receiver->SetUpToReceive(sender); MyEventArgs^ myargs = gcnew MyEventArgs("abc"); sender->Fire(myargs);
}
</source>
Extends EventArgs
<source lang="csharp">
- include "stdafx.h"
using namespace System; ref class MyEventArgs : EventArgs {
public: property String^ Info; MyEventArgs(String^ info) { Info = info; }
}; delegate void MyEventHandler(Object^ sender, MyEventArgs^ args); ref class EventSender {
public: event MyEventHandler^ MyEvent; void Fire(MyEventArgs^ args) { MyEvent(this, args); }
};
ref class EventReceiver {
public: void OnMyEvent(Object^ sender, MyEventArgs^ args) { Console::WriteLine("My Event with info: " + args->Info ); } void SetUpToReceive(EventSender^ sender) { sender->MyEvent += gcnew MyEventHandler(this, &EventReceiver::OnMyEvent); }
};
int main() {
EventReceiver^ receiver = gcnew EventReceiver(); EventSender^ sender = gcnew EventSender(); receiver->SetUpToReceive(sender); MyEventArgs^ myargs = gcnew MyEventArgs("abc"); sender->Fire(myargs);
}
</source>
Fire events and event handlers
<source lang="csharp">
- include "stdafx.h"
using namespace System; using namespace System::Threading; ref class MyEventArgs : EventArgs {
public: property String^ Info; MyEventArgs(String^ info) { Info = info; }
}; delegate void MyEventHandler(Object^ sender, MyEventArgs^ args);
ref class Events {
public: event EventHandler^ Start; event EventHandler^ Exit; void RaiseStartEvent() { Start(this, gcnew EventArgs()); } void RaiseExitEvent() { Exit(this, gcnew EventArgs()); } void OnStart(Object^ sender, EventArgs^ args) { Console::WriteLine("Starting"); } void OnExit(Object^ sender, EventArgs^ args) { Console::WriteLine("Exiting"); }
}; void f(Events^ e) {
e->RaiseStartEvent(); Console::WriteLine("Doing something."); e->RaiseExitEvent();
} int main() {
Events^ events = gcnew Events(); // add the event handlers for Start and Exit events->Start += gcnew EventHandler(events, &Events::OnStart); events->Exit += gcnew EventHandler(events, &Events::OnExit); f(events); // remove the event handlers events->Start -= gcnew EventHandler(events, &Events::OnStart); events->Exit -= gcnew EventHandler(events, &Events::OnExit);
}
</source>
Register event handler
<source lang="csharp">
- include "stdafx.h"
using namespace System; ref class EventSender{
public: event EventHandler^ MyEvent; void Fire(EventArgs^ args) { MyEvent(this, args); }
}; ref class EventReceiver{
public: void OnMyEvent(Object^ sender, EventArgs^ args){ Console::WriteLine("My Event"); } void AddHandler(EventSender^ sender){ sender->MyEvent += gcnew EventHandler(this, &EventReceiver::OnMyEvent); }
}; int main(){
EventReceiver^ receiver = gcnew EventReceiver(); EventSender^ sender = gcnew EventSender(); receiver->AddHandler(sender); EventArgs^ args = gcnew EventArgs(); sender->Fire(args);
}
</source>