2009-01-28 19 views
5

tôi cập nhật một số Managed C++ mã cũ với dòng như thế này:Cú pháp C++/CLI để đăng ký sự kiện là gì?

instanceOfEventSource->add_OnMyEvent( 
    new EventSource::MyEventHandlerDelegate(this, MyEventHandlerMethod)); 

nơi

  • EventSource là lớp học mà công bố sự kiện
  • instanceOfEventSource là một ví dụ về điều đó lớp
  • EventSource :: MyEventHandlerDelegate là loại đại biểu cho sự kiện
  • MyEventHandlerMethod là một phương pháp (không tĩnh) trong lớp hiện tại (trong đó "này" là một ví dụ) với chữ ký phù hợp với EventSource :: MyEventHandlerDelegate

Cú pháp đúng cho điều này trong C++/CLI là gì?

Trả lời

6

Cú pháp tương tự như C# 's, nói cách khác, += bị quá tải để làm cho điều này có thể:

instanceOfEventSource.MyEvent += 
    gcnew EventSource::MyEventHandlerDelegate(this, &MyClass::MyEventHandlerMethod); 

Tương tự để loại bỏ. Tuy nhiên, không giống như C#, bạn không thể bỏ qua sự khởi tạo rõ ràng của ủy nhiệm xử lý sự kiện để điều này tạo ra mã có độ dài khá dài.

+0

tôi đã phải sử dụng gcnew, và tôi cũng thấy tôi đã phải viết "@MyClass :: MyEventHandlerMethod" thay vì chỉ "MyEventHandlerMethod". Nhưng điều này đã cho tôi nơi tôi cần phải đi - cảm ơn !! – Eric

+1

Đúng về 'gcnew', tôi không thay đổi phần này của mã. Và cũng đúng về phương pháp này. : -/ –

+0

Nếu bạn không sử dụng [gcnew] (http://msdn.microsoft.com/en-us/library/te3ecsc8 (VS.80) .aspx)? –

1

Tôi chỉ mất nửa giờ để tìm cách đăng ký phương thức tĩnh làm phương thức gọi lại cho một sự kiện. Mặc dù OP không yêu cầu cụ thể việc đăng ký các phương pháp tĩnh, điều này sẽ hữu ích cho những người khác phải đối mặt với cùng một vấn đề. Nó thực sự rất đơn giản, trong trường hợp đó hàm tạo của đại biểu chỉ lấy một tham số cho phương thức đích tĩnh.

Ví dụ:

System::EventHandler^ h = gcnew System::EventHandler(&MyClass::MyStaticCallbackMethod); 
Các vấn đề liên quan