Drexel dragonThe Math ForumDonate to the Math Forum



Search All of the Math Forum:

Views expressed in these public forums are not endorsed by Drexel University or The Math Forum.


Math Forum » Discussions » Software » comp.soft-sys.matlab

Topic: Static Callback Methods?
Replies: 6   Last Post: Aug 5, 2010 5:01 PM

Advanced Search

Back to Topic List Back to Topic List Jump to Tree View Jump to Tree View   Messages: [ Previous | Next ]
Steven Lord

Posts: 17,944
Registered: 12/7/04
Re: Static Callback Methods?
Posted: Aug 3, 2010 1:21 PM
  Click to see the message monospaced in plain text Plain Text   Click to reply to this topic Reply



"per isakson" <poi.nospam@bimDOTkthDOT.se> wrote in message
news:i39avj$hk9$1@fred.mathworks.com...
> JoeyB <joseph.burgel@gm.com> wrote in message
> <b48aa8df-ed2d-4a6a-8f06-d68846ffa013@z10g2000yqb.googlegroups.com>...

>> Ok, Long time ML coder, first time ML OO coder. After about 3 hours of
>> messing around with Matlab's OO syntax, I've discovered that any
>> callback function being assigned as an event listener must be declared
>> as a static method? Where in the doc's does it talk about this? Why?
>> Here's the Matlab help example classes:
>>
>> The Event Creator:
>>
>> classdef ToggleButton < handle
>> properties
>> State = false
>> end
>> events
>> ToggledState
>> end
>> methods
>> ...
>> function OnStateChange(obj,newState)
>> % Call this method to check for state change
>> if newState ~= obj.State
>> obj.State = newState;
>> notify(obj,'ToggledState'); % Broadcast notice of event
>> end
>> end
>> end
>> end
>>
>> And the Event Consumer:
>>
>> classdef RespondToToggle < handle
>> methods
>> function obj = RespondToToggle(toggle_button_obj)
>>
>> addlistener(toggle_button_obj,'ToggledState',@RespondToToggle.handleEvnt);


What does the documentation say the callback should expect as inputs?

http://www.mathworks.com/access/helpdesk/help/techdoc/matlab_oop/brb6gnc.html#brqorok

So RespondToToggle.handleEvnt receives a ToggleButton as its first input and
an event.EventData object as its second input. If handleEvnt is a static
method in the RespondToToggle class, that's fine -- you can call a static
method without an instance of the object as one of the inputs. If it was
not a static method, then handleEvnt MUST receive a RespondToToggle object
as one of its inputs in order for the handleEvnt method of the
RespondToToggle class to be invoked. Since it doesn't in this scenario,
MATLAB checks in several places to see if it can resolve what handleEvnt
could be:

http://www.mathworks.com/access/helpdesk/help/techdoc/matlab_prog/f7-58170.html#bresuvu-3

and when it can't determine what handleEvnt could be, it throws an error.

>> You get:
>>
>> tb.OnStateChange(true)
>> Warning: Error occurred while executing callback:
>> Undefined function or method 'RespondToToggle.handleEvnt'
>> for input arguments of type 'ToggleButton'.


Yes, this error message.

>> What doc did I miss where this is described? Why do I need to do
>> this? Also, don't believe that 'clear' will reset you workspace by
>> believing this warning:
>> What's with these nebulous warnings? The doc seems to go over the same
>> trivial description of use about 15 different ways but doesn't
>> describe what you need
>> to know to make this stuff work.
>>
>> Warning: The class file for 'RespondToToggle' has been
>> changed; but the change cannot be applied because objects
>> based on the old class file still exist. If you use those
>> objects, you might get unexpected results. You can use
>> the 'clear' command to remove those objects. See 'help
>> clear' for information on how to remove those objects.


If there is an instance of an object when you try to change the class
definition, MATLAB will not update the class definition in memory to reflect
the changes. If it did, the class definition could become incompatible with
the already existing instance of the object, and that would be a Bad Thing.
This warning is telling you that you're in this situation, and that if you
really want the changes to be recognized you should clear the existing
instances.

To use an analogy (albeit not a great one), suppose you've bake a cake.
It's a very good cake, and someone asks you for the recipe. If you haven't
changed the recipe since you baked the cake, "the recipe" is unambiguous.
But if you've changed the recipe since you baked the cake, then "the recipe"
could be referring to the recipe you used to bake the cake or the recipe
with whatever changes/improvements you've added based on how the cake came
out this time. If you felt that the cake could use some extra flavor and
modified the recipe to include walnuts (for example) then giving the person
who asked for the recipe the with-walnuts version when they can taste the
cake and don't taste any walnuts could confuse them.

[I'm glad I just ate lunch :]

>> You need to type 'clear all' for the workspace to recognize your
>> changes.
>>
>> Just needed to vent. Any comments welcome.

>
> I made may first serious experiments with event the other day. Here is a
> line from one of the examples in the Matlab OOP book.
> addlistener( this.FcnObject, 'Lm', ...
> 'PostSet', @( src, evnt ) listenLm( this, src, evnt ) );
>
> listenLm is an ordinary method (-not static). My "guess" is that the
> callback is invoked in the base workspace. Thus, your example works with
> the static method. In "my" case the "scope of the object" is stored in the
> anynonous function.


If you're referring to the example in this section of the documentation:

http://www.mathworks.com/access/helpdesk/help/techdoc/matlab_oop/bq8bnrm.html#brc1wp2

The reason this works is because listenLm is being called with an object of
class fcnview as its first input, where listenLm is a method of the class
fcnview. To do the equivalent of this with the OP's example, they would
need to have handleEvnt accept a RespondToToggle object as its first input,
something like:

% assume RTTobj is a RespondToToggle object
addlistener(toggle_button_obj,'ToggledState',@(h, event) handleEvnt(RTTobj,
h, event));

> IMO this matter could have been better described in the documentation.

I'll ask the documentation staff to review this thread for ideas on how to
improve this section of the documentation.

--
Steve Lord
slord@mathworks.com
comp.soft-sys.matlab (CSSM) FAQ: http://matlabwiki.mathworks.com/MATLAB_FAQ
To contact Technical Support use the Contact Us link on
http://www.mathworks.com




Point your RSS reader here for a feed of the latest messages in this topic.

[Privacy Policy] [Terms of Use]

© Drexel University 1994-2014. All Rights Reserved.
The Math Forum is a research and educational enterprise of the Drexel University School of Education.