openstack or preopenstack confusing to new application builders

J. Landman Gay jacque at hyperactivesw.com
Sun Nov 8 19:23:31 EST 2009


william humphrey wrote:
> If you have a mainstack and lots of substacks and you put either
> a preopenstack or an openstack in the mainstack you would think that it
> would only be called when you first open your stack. Not true. It is called
> every time you switch to any of the other substacks of your main stack.

Right. Substacks inherit the script of the mainstack automatically. The 
message hierarchy works normally, and if nothing in a substack catches 
the message, it will pass through to the mainstack. This is good if you 
have certain behaviors you want to happen every time a stack opens (like 
updating a window menu, maybe) but not so good if you only want 
something to happen when the mainstack opens.

There are many ways to deal with this, and two have already been suggested:

1. If you only want something to happen once when the mainstack opens, 
put the openstack or preOpenStack handler in the first card of the 
mainstack. Substacks don't inherit the scripts of mainstack cards, only 
the one in the stack script, so handlers in the cards won't be called by 
substacks. When a mainstack first opens, it always opens at the first 
card, so the handlers will trigger from there.

2. Use blocking handlers. Put empty "openStack" or "preOpenStack" 
handlers in the stack scripts of the substacks. When they open, the 
blocking handlers will catch the messages, which won't go through to the 
mainstack. This is only convenient if you have one or two substacks, 
otherwise it's too much trouble.

3. If you really do need to put the handlers in the mainstack script, 
check to see if the stack that is opening is one you want to deal with. 
This is a good approach if you want to trigger an openStack handler in 
some substacks but not all of them. So you can do this:

  if the short name of this stack is not in "substack1,substack2"
  then pass openStack -- or "exit" if you like

That lets you decide which stacks should handle the message.

If you want only the mainstack to handler it, you can do this:

   if the short name of this stack is not the short name of me
   then pass openStack

But in this case you may as well put the handler into the first card 
instead.
-- 
Jacqueline Landman Gay         |     jacque at hyperactivesw.com
HyperActive Software           |     http://www.hyperactivesw.com



More information about the use-livecode mailing list