Limitations of 'click'?

Graham Samuel livfoss at blueyonder.co.uk
Mon Nov 14 18:30:01 EST 2005


On Mon, 14 Nov 2005 05:06:39 EST, Cubist at aol.com wrote:
>
> sez livfoss at blueyonder.co.uk:
>
>> I'm trying to traverse a set of fields whose names and numbers I
>> don't reliably know. In fact my plan is to rename them systematically
>> by visiting each one in turn. What I do know is their locations (they
>> form a grid to which the names will be related). I thought I could
>> move along the grid, storing the coordinates of the next field in
>> line in say myNewLoc, and then execute at each iteration:
>>
>>  click at myNewLoc
>>
>> or whatever. I can do this, and I am sure that I am clicking on an
>> open field, but this action doesn't seem to set either the clickField
>> or the selectedField, nor send an 'openField' message, so I can't
>> then operate on the field I've clicked on. In fact I find the
>> clickField to be empty and the selectedField to be a field which
>> clearly isn't selected. According to the RR docs, the 'click' command
>> acts as a mouse click, which would AFAIK set both these, so I must be
>> doing something wrong. Can anybody suggest what?
>>
>    Given that you absolutely *do* know the locations of the fields in
> question, something like this might do the job for you:
>
>   put "Field List" into ListOFieldz
>   repeat with K1 = 1 to the number of fields
>     put return & (the short name of field K1 & "," & the loc of  
> field K1)
> after ListOFieldz
>   end repeat
>   delete line 1 of ListOFieldz
>
>   # okay, we got all the fields. now let's sort them by location
>   sort lines numeric of ListOFieldz by item 3 of each
>   sort lines numeric of ListOFieldz by item 2 of each
>
>   # right here is a good place to delete unwanted fields,
>   #   based on the locations thereof
>
>   # and, moving right along...
>   repeat for each line LL in ListOFieldz
>     put item 1 of LL into DisFld
>     DoWhateverYouWantTo DisFld
>   end repeat
>
>    Hope this helps.
>
Thanks very much - I get the idea (the only tricky bit is the  
discarding of irrelevant fields some of which have exactly the same  
location as the relevant ones, but are stacked lower): but I can do  
it, in fact. So thanks to you I could solve the immediate problem.

However I remained extremely curious about the operation of 'click'.  
I tried an experiment with a one-card stack containing a single  
field, and 'click at' worked as advertised, firing off an 'openField'  
which could be run in the card script as easily as in the field  
itself (which is what I wanted). Eventually I realised that I had  
some kind of timing problem in the original solution. It evolved to  
the point where at the click of a button, I ran a loop which  
traversed my fields, but the actual work was done in an 'openField'  
handler invoked by my click. This tended to crash or produce the  
wrong result until I introduced a delay into the loop, like

click at myCalculatedLoc
wait 50 milliseconds

After that it worked perfectly. It seems to me that the message path  
was more complex than I had imagined: I thought that as soon as the  
'click' was executed, control would pass to the openField handler and  
it wouldn't get back to my button script until the handler was done -  
but this wasn't exactly the case. I haven't got time to work out what  
the problem really was, but I'm afraid that one of these days it will  
come up and bite me.

Graham


------------------------------------------------------------------------ 
---
Graham Samuel / The Living Fossil Co. / UK and France




More information about the use-livecode mailing list