# Getting Contents of Multiple fields in order (Left-to-Right&Down)

form form at nonsanity.com
Mon Jan 31 14:00:33 EST 2011

```I'm thinking you're going for refrigerator poetry magnets, or something like
it. To that end, I made something that reads the order similar to the way a
human would. I haven't tested it a lot, but this was the arrangement I used:

http://dl.dropbox.com/u/144280/btnorder.png

There are a dozen buttons, named with their btn number. (So button 6 is
named "6".) Notice that word 8 is at about the same level as word 9, but
still counts as part of the second row.

Running the following script sets properties on all the buttons (and one on
the card) that lets you easily walk through them from other scripts. The
scanrwords command needs to be re-run after moving the buttons, but only
then.

The last chunk of the scanwords command does a sample walkthrough and
outputs the buttons in "word" order to the messagebox. Use that code in
other functions that need to move through the words.

on scanwords
-- clear the custom properties
repeat with a = 1 to the number of btns
set the nextbtn of btn a to "0"
set the lastbtn of btn a to "0"
set the startsline of btn a to "0"
set the linenumber of btn a to "0"
set the nextline of btn a to "0"
end repeat

repeat with a = 1 to the number of btns
put item 1 of the loc of btn a into x
put item 2 of the loc of btn a into y
put "" into nxtbtn
put 100000000 into nxtd
repeat with b = 1 to the number of btns
if a = b then next repeat
put dist( loc of btn a, loc of btn b ) into d
put item 1 of the loc of btn b into x1
put item 2 of the loc of btn b into y1
if x < x1 and abs(x1 - x) >= abs(y1 - y) and d < nxtd then
put d into nxtd
put b into nxtbtn
end if
end repeat
if nxtbtn is not empty then
set the nextbtn of btn a to nxtbtn
set the lastbtn of btn nxtbtn to a
end if
end repeat

put "" into sortlines
repeat with a = 1 to the number of btns
if the lastbtn of btn a < 1
then put item 2 of the loc of btn a &","& a & return after sortlines
end repeat
sort lines of sortlines numeric by item 1 of each
repeat with a = 1 to the number of lines in sortlines
set the startsline of btn (item 2 of line a of sortlines) to a
end repeat

set the firstbtn of this card to item 2 of line 1 of sortlines
put 0 into lasttgt
repeat with a = 1 to the number of lines in sortlines
put item 2 of line a of sortlines into tgt
set the linenumber of btn tgt to a
if lasttgt > 0 then set the nextline of btn lasttgt to tgt
put the short name of btn tgt &"," after output
put tgt into lasttgt
put the nextbtn of btn tgt into tgt
repeat while tgt > 0
set the linenumber of btn tgt to a
put the short name of btn tgt &"," after output
put tgt into lasttgt
put the nextbtn of btn tgt into tgt
end repeat
end repeat

-- all buttons are now tagged with the information needed to read them
-- the first button is in the firstbtn of this card
-- buttons that start a new line have a startsline property of the line
they start
-- the line each button is on is in its linenumber property
-- the nextbtn and lastbtn point to the next and last button in that
line, respectively
-- buttons at the end of a line have a nextline property with
--    the number of the next line's first button

-- output the "words" in order to the msg box
put "" into output
put the firstbtn of this card into tgt
repeat while tgt > 0
put tgt &"," after output
get the nextbtn of btn tgt
if it < 1 then get the nextline of btn tgt
put it into tgt
end repeat
delete last char of output
put output into msg
end scanwords

function dist a, b
return sqrt( (item 1 of b - item 1 of a)*(item 1 of b - item 1 of a) +
(item 2 of b - item 2 of a)*(item 2 of b - item 2 of a) )
end dist

~ Chris Innanen
~ Nonsanity

```