DWT event handling

Lester L. Martin II lestermartin92 at gmail.com
Sun May 18 10:55:43 PDT 2008


Frank Benoit Wrote:

> bobef schrieb:
> > Lester L. Martin II Wrote:
> > 
> >> Frank Benoit Wrote:
> >>
> >>> bobef schrieb:
> >>>> void handleTextEvent (Event e, Composite composite, TreeItem item, TreeEditor editor,Text text, int inset ) 
> >>>>
> >>>> This is longer to write than new class {blah blah} :)
> >>> No, the additional arguments make the delegate a closure. If you would 
> >>> write that as a anonymous class it would look like that:
> >>>
> >>> In Java final vars are accessible for the anonymous class after the 
> >>> surrounding method ends:
> >>>
> >>> final Text text = ...
> >>> final TreeEditor editor = ...
> >>>
> >>> Listener l = new Listener {
> >>>      public void handleEvent( Event e ){
> >>>          // use text, editor as you want
> >>>      }
> >>> }
> >>>
> >>> In D1, this would create crashes. The workaround is, to create explicit 
> >>> member variable in the anonymous class. This is really ugly and very 
> >>> tedious and error-prone.
> >>>
> >>> Listener l = new class( composite, item, editor, text, inset ) Listener {
> >>>      Composite composite_;
> >>>      TreeEditor editor_;
> >>>      Text text_;
> >>>      int inset_;
> >>>      public this( Composite a, TreeItem b, TreeEditor c,Text d, int e ) {
> >>>          this.composite_ = a;
> >>>          this.editor_ = b;
> >>>          this.text_ = d;
> >>>          this.inset_ = e;
> >>>      }
> >>>      public void handleEvent( Event e ){
> >>>          // use the test_, editor_ ...
> >>>          // underscore to clearly separate them from
> >>>          // the variable used in the surounding method
> >>>      }
> >>> }
> >>>
> >>> Now you see what is the advantage of the dgListener?
> >>>
> >> In our code we just created a class that accepted a delegate. This class inherited Listener. It defined a generic event handler  that it would use if no event delegate was passed to it. What are the advantages of this template over such a design (If you need real code will post).
> >>
> >> Lester L.  Martin II
> >>
> > 
> > This was basically my point too. This way seems shorter than having to write all these arguments and having to remember them :)
> 
> The current code that look like this:
> 
> void handleMyEvent( Event e /+optional args follow+/, int myval ){
> }
> 
> addListener( DWT.Selection, dgListener( &handleMyEvent, avalue ));
> 
> What happends, that the function dgListener does create a Listener 
> class, and the handleEvent is forwareded to your supplied delegate.
> 
> What am i missing?

my code is more simple

class listen: Listener
    {
        void delegate(Event e) func_;
        
        this(void delegate(Event e) func = null)
        {
            if(func !is null)
                func_ = func;
            else
                func_ = &this.genericHandle;
        }
        
        public void handleEvent(Event e) 
        { 
            func_(e); 
        }
        
        public void genericHandle(Event e)
        {
            Stdout("Event Accepted.").newline.flush;
        }
    }

(user is a declared DWT variable)

user.addListener(new listen(&dg));

(this is a function inside a class)

private void dg(Event E)
{
    //handle event here
}



More information about the Digitalmars-d-dwt mailing list