BTW:

Instead of using Reflection

click_event = button.GetType.get_event("Click")
on_click = EventHandler.new { |sender, e| puts "Click!" }
click_event.add_event_handler(button, on_click)

you can do

handler = lambda { |sender, e| puts "Click!" }
button.on_click.add handler
button.on_click.remove handler

or just

button.on_click { |sender, e| puts "Click!" }

if you don't need to remove the handler.

Tomas


From: ironruby-core-boun...@rubyforge.org 
[mailto:ironruby-core-boun...@rubyforge.org] On Behalf Of Jimmy Schementi
Sent: Tuesday, August 04, 2009 12:15 PM
To: ironruby-core@rubyforge.org
Subject: Re: [Ironruby-core] Getting a delegate in IronRuby

I believe that commit is the one that didn't get into the binary build of 
0.9.0, but is (strange enough) tagged with 0.9 in GitHub. Thanks for pointing 
that out though.

From: ironruby-core-boun...@rubyforge.org 
[mailto:ironruby-core-boun...@rubyforge.org] On Behalf Of Martin Smith
Sent: Tuesday, August 04, 2009 12:05 PM
To: ironruby-core@rubyforge.org
Subject: Re: [Ironruby-core] Getting a delegate in IronRuby

Thank you all for your suggestions. They've been most helpful. I think i've 
mostly wrapped my head around event handlers.  Here's one last question.  
What's the best way to test if a given object is an event?  Obviously the way 
below: (object.GetType.get_event("EventName") != nil) is one way, but is there 
a more efficient (more rubonic) way?

I've tried:

button = Button.new
button.click # => IronRuby.Builtins.RubyEvent
# I cant test against IronRuby::Builtins::RubyEvent, because it's not defined
button.click.is_a?(System::EventHandler)
# error, about TypeGroups
button.click.is_a?(System::EventHandler[]) # false

As an aside, I looked at the changelog for, 0.9.0 and saw this:

       2) Implements TypeGroup#[] overload taking a Fixnum. This is useful when 
one

                 needs to select a generic type definition out of a group of 
types. For example,
                       given three classes C:

                      public class C {
                        public virtual int Arity { get { return 0; } }
                      }
                      public class C<T> {

                        public virtual int Arity { get { return 1; } }
                      }
                      public class C<T,S> {
                        public virtual int Arity { get { return 2; } }
                      }

                      p C[0]  # => C
                      p C[1]  # => C[T]
                      p C[2]  # => C[T, S]

However, this fails:

System::EventHandler[0] # invalid value for class: 0

You guys have been super helpful.  It's really great to see such an active and 
great community forming around IronRuby.

Thanks,
Martin
On Mon, Aug 3, 2009 at 6:52 PM, Ray Vernagus 
<r.verna...@gmail.com<mailto:r.verna...@gmail.com>> wrote:
** I tried sending this much earlier but my message didn't go through **

Hi, Martin--

Here's a short example that might illustrate what you're trying to accomplish:

require "System.Windows.Forms"
include System
include System::Windows::Forms

button = Button.new

click_event = button.GetType.get_event("Click")

on_click = EventHandler.new { |sender, e| puts "Click!" }

click_event.add_event_handler(button, on_click)

button.perform_click # Click!

click_event.remove_event_handler(button, on_click)

button.perform_click

More canonical examples of using events in IronRuby are found here: 
http://www.ironruby.net/Documentation/.NET/Events

--Ray
On Mon, Aug 3, 2009 at 2:46 PM, Martin Smith 
<martin.smith...@gmail.com<mailto:martin.smith...@gmail.com>> wrote:
Hello,

I was wondering how I can get a delegate in IronRuby.

One thing I was thinking about doing was trying to attach an event handler with 
an EventInfo and it requires a delegate.  It has a method called 
AddEventHandler(object, Delegate), and i wanted to attach an event handler.

But I can't find any way to get a delegate in ruby.  How would you guys do it?

I know i can also use:

object.send(event_name) { |*e| ...... }

In that case how would i remove that event handler?

Thanks in advance,
Martin
_______________________________________________
Ironruby-core mailing list
Ironruby-core@rubyforge.org<mailto:Ironruby-core@rubyforge.org>
http://rubyforge.org/mailman/listinfo/ironruby-core


_______________________________________________
Ironruby-core mailing list
Ironruby-core@rubyforge.org<mailto:Ironruby-core@rubyforge.org>
http://rubyforge.org/mailman/listinfo/ironruby-core

_______________________________________________
Ironruby-core mailing list
Ironruby-core@rubyforge.org
http://rubyforge.org/mailman/listinfo/ironruby-core

Reply via email to