Proper Field Validation Methods and other annoyances...
Rob Cozens
rcozens at pon.net
Wed Aug 15 12:21:57 EDT 2007
Hi Len,
>1) Why does put "4" is a date return true? If this function
>doesn't actually work, why is it still available? I'd like to be
>able to have users enter a date without any kind of punctuation
>(i.e., 08142007) and be able to validate it as a valid date. The
>same applies to entering 1315 as a time (no colon).
Others have explained why "is a date" returns true for any integer.
Here is a function that validates user input as valid according to
the current system date format and returns the date in dateItems format.
function validDate theString -- 5 April 04:RCC
put stripBlanks(theString,false) into theString -- strips leading
or trailing blanks from a string
get systemDateFormat() -- see Called Routines below
set the itemDelimiter to char -1 of it -- the Separater
if the number of items of theString <> 3 then return false
delete the last char of it
delete char offset("mm",it) of it -- remove double characters, if any...
-- which
there will be until RR system date
--
correctly recognizes suppression of leading
-- zeroes
delete char offset("dd",it) of it
delete char offset("yy",it) of it
repeat with x = 1 to 3
switch char x of it
case "m"
put item x of theString into theMonth
if not validDigits(theMonth) then return false -- each
char >= "0" and <= "9"
if theMonth < 1 or theMonth > 12 then return false
break
case "d"
put item x of theString into theDay
if not validDigits(theDay) then return false
if theDay < 1 or theDay > 31 then return false
break
case "y"
put item x of theString into theYear
if not validDigits(theYear) then return false
put length(theYear) into charCount
if charCount <> 2 and charCount <> 4 then return false
if charCount is 2 then add 2000 to theYear
if theYear < 1 then return false
break
end switch
end repeat
if theDay < 29 then return
true&return&theYear&comma&theMonth&comma&theDay&",0,0,0,0"
if theMonth is 2 then
if theDay > 29 or not leapYear(theYear) then return false --
leapYear returns boolean
else return true&return&theYear&comma&theMonth&comma&theDay&",0,0,0,0"
else
if offset("0",theMonth) = 1 then delete char 1 of theMonth
set the itemDelimiter to comma
if theMonth is among the items of "1,3,5,7,8,10,12" then return
true&return&theYear&comma&theMonth&comma&theDay&",0,0,0,0"
if theDay is 31 then return false
else return true&return&theYear&comma&theMonth&comma&theDay&",0,0,0,0"
end if
end validDate
Cal;led routines:
function systemDateFormat
put "1999,1,9,0,0,0,0" into testDate
convert testDate to short system date -- RR pads day/month
regardless of settings
--
which means function will not recognize the
--
absence of leading zeroes until this is fixed
put 2 into characterNumber
repeat while char characterNumber of testDate is in "1,9"
add 1 to characterNumber
end repeat
put char characterNumber of testDate into dateSeparater
put empty into returnDateFormat
set the itemDelimiter to dateSeparater
repeat for each item datePart in testDate
if datePart > 9 then
if datePart > 99 then put "y" after returnDateFormat
put "y" after returnDateFormat
else if datePart > 1 then
if length(datePart) > 1 then put "d" after returnDateFormat
put "d" after returnDateFormat
else
if length(datePart) > 1 then put "m" after returnDateFormat
put "m" after returnDateFormat
end if
end repeat
return returnDateFormat&dateSeparater
end systemDateFormat
>2) This is the "biggie." What is the proper way to validate the
>contents of a field. I tried writing a "closeField" script that
>would do the validation, put up a message box if the format/contents
>are wrong, then set the focus back to the field for correction by
>the user. I end up getting two insertion point cursors (one in the
>"bad" field and one in the next field. The keyboard does go to the
>bad field but having more than one insertion point is confusing to
>me let alone my end users. By the way, I have tried not passing the
>closeField message but I'm not sure if the "tab to next field" takes
>place anyway.
Among my back burner projects is a Data Dictionary-driven RAD, which
will validate user input in a field as compliant with the Data
Dictionary specifications for the data that field captures (eg:
required?, numeric?, # of decimal positions, show thousands
separator?, show currency symbol?, lookup table, autoentry?, max
length, max lines, etc). Only some of the edits have been tested at
this stage; but all that our working are triggered by closeField,
enterInField (and returnInField for single-line fields),or internal
logic if auto-entry fields, and I have not experienced the problems
you describe.
However, I would note that my user interface keeps ALL fields without
focus locked while accepting user input in a field. When the user
signals "I'm done", the field contents are validated to DD specs. If
invalid, an error message is displayed; if valid, the field is locked
and the next (either by ordinal or based on the user input) field is
unlocked and given focus.
>3) Related to #2 above, I frequently get vertical lines (insertion
>point cursors) in a field as I move the mouse across it. Once they
>start showing up, (and they stay so I end up with vertical bars
>between every letter in the field!), I can get them to appear by
>moving the mouse ABOVE the field (not in it) like I have a vertical
>line that runs the height of the entire screen. Is this something
>I'm doing or is it a known problem?
Do you get the same effect from a standalone compiled from your stack?
Rob Cozens CCW
Serendipity Software Company
"And I, which was two fooles, do so grow three;
Who are a little wise, the best fooles bee."
from "The Triple Foole" by John Donne (1572-1631)
More information about the use-livecode
mailing list