keyDown, the final chapter

Richard Gaskin ambassador at fourthworld.com
Tue Oct 27 19:35:28 EDT 2009


DunbarX wrote:
> The following flies in the face of everything we just anguished over.
> 
> Nothing in the stack script. This in the field script...
> 
> on keydown
>     send "beep" && "3" to this stack
>     --dispatch "beep" to this stack with "3"
> end keyDown
> 
> Comment either as you see fit. Type a char.
> 
> "Send" works (that is, beeps) and "dispatch" does not. Go figure. And just 
> when I was getting used to it all.

As Sarah pointed out, if you want to get a useful result just do this:

on keyUp
   beep 3
end keyUp

There you have it:  your character goes in the field and you get three 
beeps afterward.

If instead you want to find the boundaries of the engine's sanity, this 
way madness lies. ;)  There are no doubt inconsistencies in all the 
xTalk dialects, and RevTalk is no exception.

But there appear to be at least some basic rules you can use to navigate 
this jungle:

- Handlers handle messages

   If an object has no handler for a message, it has no way
   to handle that message.


- Messages can only be successfully sent to a script that has a
   handler for them.

   If you want a specific object to handle a message, give that
   object a handler for it.


- You can send built-in commands (as distinct from messages)
   to objects which have no handler for them.

   Since you can't define your own custom commands of the same
   name as a built-in command, this is consistent with the
   Raney fixation on pruning the message path to the essentials,
   since commands aren't messages per se.

   It's really just another way to call a command, but does so
   in a way that changes the target.

   If you don't need to change the target (such as in your example
   above) it's often simpler to just call the command from the
   script that needs it rather than slowing down both its
   performance and your typing by sending it to another object.


- Dispatch will send anything to any object, but will only
   trigger handlers which exist in the destination object's
   script.

   This is as described.  Dispatch is the most recent addition
   to the language as far as message-path-altering commands go,
   and was added primarily for behaviors to be able to send
   messages to instances (though it can be useful in many other
   contexts as well).

   The Dictionary entry for the dispatch command notes that the
   local variable "it" will contain one of these three strings
   after dispatch is used:

    "handled" - the message was handled and not passed
    "unhandled" - no matching handlers were found
    "passed" - the message was handled but passed by all handlers

   In your example above, I suspect "it" contains "unhandled".

   Because dispatch offers this unique feedback to the caller,
   it rarely complains about things like "handler no found",
   instead noting that in "it".

   This is valuable for behaviors because behavior instances
   can individually override or overload handlers, so this
   not only gets the message to the desired target well but
   also provides additional information which may be useful
   to the behavior script that dispatched it.


This has been a long thread so I may have missed a few things, but I 
think these four rules cover just about everything I can recall from 
these explorations.

Have I missed anything?


Extra bonus point rule:  Anytime you you miss something from HC, ask 
here and Sarah or Jacque or me or someone else will help you find a way 
to do the same thing in Rev, and usually in the same number of lines or 
fewer. :)

I know that's a tall order, and with multi-card label printing HC will 
win because they provided a GUI for that.  But for just about everything 
else I can think of, Rev has shown itself to be very capable and 
remarkably efficient.

--
  Richard Gaskin
  Fourth World
  Rev training and consulting: http://www.fourthworld.com
  Webzine for Rev developers: http://www.revjournal.com
  revJournal blog: http://revjournal.com/blog.irv



More information about the use-livecode mailing list