Target not working???
David Burgun
dburgun at dsl.pipex.com
Tue Mar 28 06:09:47 EST 2006
Hi Mark,
On 27 Mar 2006, at 22:41, Mark Wieder wrote:
> David-
>
> Monday, March 27, 2006, 9:21:13 AM, you wrote:
>
>> All I want to do is to call a handler if it exists in a script. I've
>> read up on the message path etc. but not sure how it applies in this
>> case. Could you elaborate?
>
> OK. Now I see what you're trying to do here. But I still see two
> problems with this:
>
> One, I don't see a way to differentiate messages coming from multiple
> sources. If object A responds to B events, then how do you limit it to
> responding only to B event messages from object C? What if object D
> also generates B events?
That's legal. A message is sent to *all* listening objects. For
example, a "Folder_Selected" message could be sent to a field that
displays the folder path name, another that uses the folder path name
to display a list of files, another field that just displays the
folder name without the path and a button that is enabled or disabled
depending on if there is currently a folder selected.
If you want to have more than one folder, e.g. say a source and
destination folder, then you can use the "Kind" field to
differentiate, e.g. objects that want to act on a Source folder being
selected listen for "Folder_Selected", "FolderKindSource" and
objects that want to act on the Destination folder listen for
"Folder_Selected", "FolderKindDestination".
> Two, I still think you're fighting the "natural" object hierarchy. Why
> not have the stack initialize its own objects when it starts up
> instead of forcing it from the parent stack? Or more correctly, why
> not have the library stack tell each of its controls to initialize
> themselves, i.e.,
>
> -- in the library stack
> -- untested code
> on openStack
> local x
>
> repeat with x=1 to the number of controls of this stack
> try
> send "ISM_InitializeObject" to control x
> end try
> end repeat
> end openStack
>
> on closeStack
> --unregister all objects
> end closeStack
>
> Or, if you use setProp handlers instead, you can just say
>
> on openStack
> local x
>
> repeat with x=1 to the number of controls of this stack
> set the ISM_InitializeObject of control x to empty
> end repeat
> end openStack
>
> then you don't have to worry about whether or not the control supports
> the ISM_InitializeObject handler - you'll just set a harmless custom
> property if it doesn't.
>
There are a number of reasons:
1. I am trying to cut down on the amount of code and the number of
places that needs to be changed if you want to either add an existing
object from the Object Library or to write a new Object (that might
be added to the library at a later date).
2. Speed. I do more than just send the ISM_InitializeObject message
while looping thru the objects in a stack. At present there are
checks on a call-by-call basis (e.g. when a stack Calls a
"ISMListenForMessage" or "ISMPutMessage") and this impacts the
performance. It's better to do all this at "start using" time and
hold that information so as to save time once ISM has initialized.
This is a data dependent algorithm (which are to be avoided if
possible) and I am just following good software engineering practice,
e.g. if you absolutely MUST use a data dependent algorithm the put as
much processing as possible so as to make it more worthwhile.
3. Although the code I posted shows the ISM_InitializeObject being
called in the loop, this was just to illustrate what I wanted to
achieve. In the real Library I actually just build a list/array and
call the handler later on.
4. It seems like better OOP practice to hold all the information/code
that an object needs in one place.
I really can't see that I am "fighting the "natural" object
hierarchy". The loop (or something like it needs) to be held
somewhere, the fact that it is held in a "central" place really
doesn't make much difference. In your example I'd need N loops, one
for each stack, doing it my way just results in one loop, e.g. less
code. Of course you could make a common function out of your loop and
store it in the Stack Script or in a Library and then just call it
from each object. This wouldn't be "fighting the "natural" object
hierarchy", so how can putting in *my* library be different?
All the Best
Dave
More information about the use-livecode
mailing list