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