Home   Archive   Permalink



Heads-down data entry

I am thinking of experimenting with another kind of application that REBOL might not have been designed for, the idea of 'heads-down' data entry where a person keys data into a screen, from a piece of paper, probably using the numeric keypad, without ever using the mouse or looking at the keyboard. All/most fields will contains fixed numbers of characters (like a date containing eight), and when a field on the screen is filled with the expected number of characters the focus automatically jumps to the next field. As an added bonus, when that last character of a field is typed, the program could perform some validation. For example, after the eighth digit of a date is entered, the program could check the date for validity, beep the computer if invalid, or move the focus to the next field if valid.    
    
I am wondering if anyone can point me in a general direction for investigation. The best idea I can think of so far is to set the inter-field spacing to zero, and then make a 20-pixel field for each individual character, and then capture keystrokes the way it is done on the various calculator programs one can find on rebol.org.
    
Thank you.

posted by:   Steven White     16-Feb-2017/11:16:10-8:00



R E B O L []
beep-sound: load to-binary decompress 64#{
eJwBUQKu/VJJRkZJAgAAV0FWRWZtdCAQAAAAAQABABErAAARKwAAAQAIAGRhdGEl
AgAA0d3f1cGadFQ+T2Z9jn1lSjM8T2uNsM/j7Midc05PWGh4eXVrXE5DQEZumsTn
4M2yk3hiVU9fcX+GcFU8KkNmj7rR3+HYroJbPUpfdoqAbldBP0ZWbpW62OvRrohk
WlleaHB2dW9bRzo1WYWy3OHbyrKObVNCVGp/jXpgRC48Vnievtfm6MCUaUVLWW1/
fXNkUkdCRlN7ps3r3cSkgm1fWFhmdH2AaVA6LElwnMja4dzNpHtXPUxje45/aVA5
PUtif6TG3uvMpHtXU1lkcnd2cGVURT0+ZJC84+HUvaGCZ1NIWm6AinVaQCtAX4Wu
yt3k37aJYEBKXXOHf3FdSEJET2KJsdPr1reUcGJbW2FsdXl2YUs5MFF7qdPe3tO+
mHNUP1Bnfo59ZEkyPFFukbTR5OvGm3BMTVlpent1aVpMQ0FJcZ3I6uHMsJB2YlZR
YXJ/hW5UOypEaJK90+Dg1qyBWjxKYHeLgG1WPz9HWXKYvNnr0KyFYVhZX2pydnVu
Wkc7N1yHtN3h2sivjGxTRFZrgI15X0MtPVh7osHZ5ua+kmdES1tvgn5zY1BGQ0hW
fqjO69vBoX9rXllaaHV9fmhPOi1Lcp/K2+DayaF4Vj1NY3uNfmhONjxLZIKnyODr
yqJ4VFFYZHN3dm5iUUM9QGaTv+Th0rqdf2VTSltvgIl0WT4rQGCIssze5N60iF8/
Sl10h39vW0ZBRFFljLPU69W1kG1gWlxiYHkWb1ECAAA=
}
beep: does [sp: open sound:// insert sp beep-sound wait sp close sp]
digits: charset "0123456789"
f1incomplete: yes
w: view/new layout [
    f1: field
    f2: field
]
forever [
    if all [f1incomplete 8 = length? ft: f1/text][
     either parse ft [8 digits][
        f1incomplete: no
        focus f2
     ][
        beep
     ]
    ]
    show w if not viewed? w [quit] wait .2    
]

posted by:   Nick     16-Feb-2017/22:30:15-8:00



It's much simpler if you can require the user to press ENTER at the end if each field:
    
R E B O L []
beep-sound: load to-binary decompress 64#{
eJwBUQKu/VJJRkZJAgAAV0FWRWZtdCAQAAAAAQABABErAAARKwAAAQAIAGRhdGEl
AgAA0d3f1cGadFQ+T2Z9jn1lSjM8T2uNsM/j7Midc05PWGh4eXVrXE5DQEZumsTn
4M2yk3hiVU9fcX+GcFU8KkNmj7rR3+HYroJbPUpfdoqAbldBP0ZWbpW62OvRrohk
WlleaHB2dW9bRzo1WYWy3OHbyrKObVNCVGp/jXpgRC48Vnievtfm6MCUaUVLWW1/
fXNkUkdCRlN7ps3r3cSkgm1fWFhmdH2AaVA6LElwnMja4dzNpHtXPUxje45/aVA5
PUtif6TG3uvMpHtXU1lkcnd2cGVURT0+ZJC84+HUvaGCZ1NIWm6AinVaQCtAX4Wu
yt3k37aJYEBKXXOHf3FdSEJET2KJsdPr1reUcGJbW2FsdXl2YUs5MFF7qdPe3tO+
mHNUP1Bnfo59ZEkyPFFukbTR5OvGm3BMTVlpent1aVpMQ0FJcZ3I6uHMsJB2YlZR
YXJ/hW5UOypEaJK90+Dg1qyBWjxKYHeLgG1WPz9HWXKYvNnr0KyFYVhZX2pydnVu
Wkc7N1yHtN3h2sivjGxTRFZrgI15X0MtPVh7osHZ5ua+kmdES1tvgn5zY1BGQ0hW
fqjO69vBoX9rXllaaHV9fmhPOi1Lcp/K2+DayaF4Vj1NY3uNfmhONjxLZIKnyODr
yqJ4VFFYZHN3dm5iUUM9QGaTv+Th0rqdf2VTSltvgIl0WT4rQGCIssze5N60iF8/
Sl10h39vW0ZBRFFljLPU69W1kG1gWlxiYHkWb1ECAAA=
}
beep: does [sp: open sound:// insert sp beep-sound wait sp close sp]
digits: charset "0123456789"
view layout [
    f1: field [either parse face/text [8 digits][focus f2][beep]]
    f2: field
]

posted by:   Nick     16-Feb-2017/22:41:04-8:00



If you want to distribute a separate wav file:
    
R E B O L []
digits: charset "0123456789"
view layout [
    f1: field [
     either parse face/text [8 digits][focus f2][
        insert s: open sound:// load %/c/windows/media/chord.wav wait s close s
     ]
    ]
    f2: field
]

posted by:   Nick     16-Feb-2017/22:52:28-8:00



Put the validation routine into a function, and it's easy to add fields with any validation rules you want:
    
R E B O L []
call ""
digits: charset "0123456789"
validate: func [f rule] [
    if not parse f/text rule [attempt [
     insert s: open sound:// load %/c/windows/media/chord.wav wait s close s
    ]]
]
view layout [
    f1: field [validate face [8 digits]]
    field [validate face [4 digits]]
    field [validate face ["(" 3 digits ")"]]
    do [focus f1]
]

posted by:   Nick     17-Feb-2017/11:12:07-8:00



I added this one to the short examples page:
    
R E B O L [title: "Field Validator"]
nums: charset "0123456789" alfs: charset [#"a" - #"z" #"A" - #"Z"] call ""
validate: func [f rule] [if not parse f/text rule [attempt [
    insert s: open sound:// load %/c/windows/media/chord.wav wait s close s
]]]
view layout [
    f1: field "12345678" [validate face [8 nums]]
    field "1234" [validate face [4 nums]]
    field "(555)123-2345" [validate face ["(" 3 nums ")" 3 nums "-" 4 nums]]
    field "me@url.com" [validate face [some alfs "@" some alfs "." 3 alfs]]
    do [focus f1]
]

posted by:   Nick     18-Feb-2017/5:59:36-8:00