WinBatch Tech Support Home

Database Search

If you can't find the information using the categories below, post a question over in our WinBatch Tech Support Forum.

TechHome

RegExp

Can't find the information you are looking for here? Then leave a message over on our WinBatch Tech Support Forum.

Field validation with WinBatch Dialog

Keywords: Validate Validation Strong Password Passwords

The following example is as simple and clean as I can make a fully validated dialog. It applies real-time validation via simple patterns and deferred validation (after user clicks OK) using regular expressions (if desired). The combination provides for complete control over the user input. This works for dialogs with any number of fields without lag because the real-time validation is only done on the field that has focus.
; Field Validation with WinBatch Dialog
; Les Ferch, 2008-02-28

; ----------------------------------------------------------------------------------------------
#DefineFunction Valid(DlgHandle,ControlNum,Pattern)
; Validate editbox data in a dynamic dialog using patterns
; Add to and/or modify the patterns below to suit your needs (e.g. add accented characters)
BadChar = 0
Str = DialogControlGet(DlgHandle,ControlNum,3)
Len = StrCharCount(Pattern)
For i = 1 To Len
   Char = StrSub(Str,i,1)
   PatternChar = StrSub(Pattern,i,1)
   Switch 1
   Case StrCharCount(Str)<i
      Break
   Case PatternChar=="?" ; Allow anything
      Break
   Case PatternChar=="A" ; Uppercase letters
      GoSub MakeUpper
      BadChar = StrScan(Char,"ABCDEFGHIJKLMNOPQRSTUVWXYZ",1,@FWDSCAN)==0
      Break
   Case PatternChar=="a" ; Any letters
      BadChar = StrScan(StrLower(Char),"abcdefghijklmnopqrstuvwxyz",1,@FWDSCAN)==0
      Break
   Case PatternChar=="'" ; Any letters or apostrophe or dash
      BadChar = StrScan(StrLower(Char),"'-abcdefghijklmnopqrstuvwxyz",1,@FWDSCAN)==0
      Break
   Case PatternChar=="N" ; Uppercase alphanumeric
      GoSub MakeUpper
      BadChar = StrScan(Char,"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",1,@FWDSCAN)==0
      Break
   Case PatternChar=="K" ; Uppercase alphanumeric plus space
      GoSub MakeUpper
      BadChar = StrScan(Char," ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",1,@FWDSCAN)==0
      Break
   Case PatternChar=="n" ; Alphanumeric
      BadChar = StrScan(StrLower(Char),"abcdefghijklmnopqrstuvwxyz0123456789",1,@FWDSCAN)==0
      Break
   Case PatternChar=="*" ; Alphanumeric plus limited special characters
      MatchString = StrCat("abcdefghijklmnopqrstuvwxyz0123456789`~!@#$%%^&*()-_=+[{]}\|;:',<.>/?",'"')
      BadChar = StrScan(StrLower(Char),MatchString,1,@FWDSCAN)==0
      Break
   Case PatternChar=="0" ; Numbers
      BadChar = StrScan(Char,"0123456789",1,@FWDSCAN)==0
      Break
   Case 1 ; Otherwise match exactly
      BadChar = Char<>PatternChar
      Break
   EndSwitch
   If BadChar Then Str = StrSub(Str,1,i - 1)
Next
If !BadChar && StrCharCount(Str)>Len ; Limit length
   BadChar = 1
   Str = StrSub(Str,1,Len)
EndIf
If BadChar Then DialogControlSet(DlgHandle,ControlNum,3,Str)
Return

:MakeUpper
If Char<>StrUpper(Char)
   Char = StrUpper(Char)
   Str = StrCat(StrSub(Str,1,i - 1),Char,StrSub(Str,i + 1,-1))
   DialogControlSet(DlgHandle,ControlNum,3,Str)
EndIf
Return

#EndFunction

; ----------------------------------------------------------------------------------------------
; Use regular expressions to validate data after OK is clicked
#DefineFunction ValidRE(Str,RE,IgnoreCase)
oRE = ObjectCreate("VBScript.RegExp")
oRE.Pattern = RE
oRE.IgnoreCase = IgnoreCase
RetVal = oRE.Test(Str)<>0
ObjectClose(oRE)
Return RetVal
#EndFunction

; ----------------------------------------------------------------------------------------------
; Callback procedure for sample dialog
#DefineFunction SampleDlgCallbackProc(DlgHandle,DlgMsg,DlgID,DlgEvt,rsvd)
Switch DlgMsg
Case 0 ; MSG_INIT
   DialogProcOptions(DlgHandle,5,@TRUE)
   DialogControlState(DlgHandle,26,3,16) ; Enable mask for password field
   Return -1 ; RET_DO_DEFAULT
Case 5 ; MSG_EDITBOX
   ControlNum = DialogControlState(DlgHandle,5,5,0) ; Get active field
   V15 = "Aaaaaaaaaaaaaaaaaaaa"
   V16 = "A'''''''''''''''''''"
   V17 = "???????????????????????????????????"
   V18 = "???????????????????????????????????"
   V19 = "A??????????????????????????????????"
   V20 = "A0A 0A0"
   V21 = "KKKKKKKK"
   V22 = "00000"
   V23 = "000-000-0000"
   V24 = "???????????????????????????????????"
   V25 = "000-00-0000"
   V26 = "***********************************" ; 35 char field with limited special characters
   ;V26 = "???????????????????????????????????" ; 35 char field allowing all characters
   Valid(DlgHandle,ControlNum,v%ControlNum%) ; Validate data in active field
   Return -1 ; RET_DO_DEFAULT
EndSwitch
Return -1 ; RET_DO_DEFAULT
#EndFunction

; ----------------------------------------------------------------------------------------------
; Main Routine
; Keep user in input dialog until all data passes validation or user cancels
; Change color variable to 128 (yelow field background) if data is not valid

GoSub InitBackColor
While 1
   GoSub SampleDialog
   GoSub InitBackColor
   DataOK = @TRUE
   If StrCharCount(FName)<1 Then C15 = 128
   If StrCharCount(LName)<2 Then C16 = 128
   If StrCharCount(Address1)<3 Then C17 = 128
   If StrCharCount(City)<2 Then C19 = 128
   If !ValidRE(CPC,"[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ] \d[ABCEGHJKLMNPRSTVWXYZ]\d$",0) Then C20 = 128
   If !ValidRE(UKPC,"[A-Z]{1,2}\d[A-Z\d]? \d[ABD-HJLNP-UW-Z]{2}",0) Then C21 = 128
   If StrLen(Zip)<5 Then C22 = 128
   If StrLen(Phone)<12 Then C23 = 128
   If !ValidRE(Email,"^[\w-\.]+@(\w+[\w-]+\.){0,3}\w+[\w-]+\.[a-zA-Z]{2,4}$",0) Then C24 = 128
   If StrLen(SSN)<11 Then C25 = 128
   If !ValidRE(PW,"^.*(?=.{8,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[\w]).*$",0) Then C26 = 128
   PWSpecialCharFound = 0
   For i = 1 To StrCharCount(PW)
      Char = StrUpper(StrSub(PW,i,1))
      AllowAllSpecialChars = 0 ; Change to 1 to allow all special characters
      If AllowAllSpecialChars && StrScan(Char,"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",1,@FWDSCAN)==0 Then PWSpecialCharFound = 1
      SpecialCharSet = StrCat("`~!@#$%%^&*()-_=+[{]}\|;:',<.>/?",'"')
      If !AllowAllSpecialChars && StrScan(Char,SpecialCharSet,1,@FWDSCAN)<>0 Then PWSpecialCharFound = 1
   Next
   If !PWSpecialCharFound Then C26 = 128
   For i = 15 To 26
      If C%i%==128 Then DataOK = @FALSE
   Next
   If DataOK Then Break
EndWhile

Exit

; ----------------------------------------------------------------------------------------------
; Initialize these dialog variables to 255 to set field background to white
:InitBackColor
For i = 15 To 26
   C%i% = 255 ; Initialize background color
Next
Return

; ----------------------------------------------------------------------------------------------
; Sample input dialog
:SampleDialog
SampleDlgFormat = `WWWDLGED,6.1`

SampleDlgCaption = `Data Validation Example`
SampleDlgX = 037
SampleDlgY = 107
SampleDlgWidth = 248
SampleDlgHeight = 216
SampleDlgNumControls = 026
SampleDlgProcedure = `SampleDlgCallbackProc`
SampleDlgFont = `DEFAULT`
SampleDlgTextColor = `DEFAULT`
SampleDlgBackground = `DEFAULT,DEFAULT`
SampleDlgConfig = 0

SampleDlg001 = `081,194,036,012,PUSHBUTTON,DEFAULT,"OK",1,13,32,DEFAULT,DEFAULT,DEFAULT`
SampleDlg002 = `127,194,036,012,PUSHBUTTON,DEFAULT,"Cancel",0,14,DEFAULT,DEFAULT,DEFAULT,DEFAULT`

SampleDlg003 = `078,005,028,012,STATICTEXT,DEFAULT,"First name:",DEFAULT,15,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
SampleDlg004 = `077,020,032,012,STATICTEXT,DEFAULT,"Last Name:",DEFAULT,16,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
SampleDlg005 = `052,035,060,012,STATICTEXT,DEFAULT,"Street Address Line 1:",DEFAULT,17,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
SampleDlg006 = `052,050,060,012,STATICTEXT,DEFAULT,"Street Address Line 2:",DEFAULT,18,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
SampleDlg007 = `093,065,014,012,STATICTEXT,DEFAULT,"City:",DEFAULT,19,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
SampleDlg008 = `013,080,092,012,STATICTEXT,DEFAULT,"Canadian Postal Code (e.g. V4S 1A5):",DEFAULT,20,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
SampleDlg009 = `024,095,080,012,STATICTEXT,DEFAULT,"UK Postal Code (e.g. AA99 9AA):",DEFAULT,21,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
SampleDlg010 = `038,110,070,012,STATICTEXT,DEFAULT,"USA Zip Code (e.g. 10010):",DEFAULT,22,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
SampleDlg011 = `008,125,102,012,STATICTEXT,DEFAULT,"10 digit phone num (e.g. 800-555-5555):",DEFAULT,23,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
SampleDlg012 = `069,140,040,012,STATICTEXT,DEFAULT,"Email Address:",DEFAULT,24,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
SampleDlg013 = `046,155,060,012,STATICTEXT,DEFAULT,"SSN (e.g. 999-99-9999):",DEFAULT,25,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
SampleDlg014 = `006,170,120,012,STATICTEXT,DEFAULT,"PW (8 min, 1 UC, 1 LC, 1 num, 1 special):",DEFAULT,26,DEFAULT,DEFAULT,DEFAULT,DEFAULT`

SampleDlg015 = `111,005,100,012,EDITBOX,FName,DEFAULT,DEFAULT,1,DEFAULT,DEFAULT,DEFAULT,"255|255|%C15%"`
SampleDlg016 = `111,020,100,012,EDITBOX,LName,DEFAULT,DEFAULT,2,DEFAULT,DEFAULT,DEFAULT,"255|255|%C16%"`
SampleDlg017 = `111,035,124,012,EDITBOX,Address1,DEFAULT,DEFAULT,3,DEFAULT,DEFAULT,DEFAULT,"255|255|%C17%"`
SampleDlg018 = `111,050,124,012,EDITBOX,Address2,DEFAULT,DEFAULT,4,DEFAULT,DEFAULT,DEFAULT,"255|255|%C18%"`
SampleDlg019 = `111,065,100,012,EDITBOX,City,DEFAULT,DEFAULT,5,DEFAULT,DEFAULT,DEFAULT,"255|255|%C19%"`
SampleDlg020 = `111,080,034,012,EDITBOX,CPC,DEFAULT,DEFAULT,6,DEFAULT,DEFAULT,DEFAULT,"255|255|%C20%"`
SampleDlg021 = `111,095,034,012,EDITBOX,UKPC,DEFAULT,DEFAULT,7,DEFAULT,DEFAULT,DEFAULT,"255|255|%C21%"`
SampleDlg022 = `111,110,026,012,EDITBOX,Zip,DEFAULT,DEFAULT,8,DEFAULT,DEFAULT,DEFAULT,"255|255|%C22%"`
SampleDlg023 = `111,125,040,012,EDITBOX,Phone,DEFAULT,DEFAULT,9,DEFAULT,DEFAULT,DEFAULT,"255|255|%C23%"`
SampleDlg024 = `111,140,124,012,EDITBOX,Email,DEFAULT,DEFAULT,10,DEFAULT,DEFAULT,DEFAULT,"255|255|%C24%"`
SampleDlg025 = `111,155,040,012,EDITBOX,SSN,DEFAULT,DEFAULT,11,DEFAULT,DEFAULT,DEFAULT,"255|255|%C25%"`
SampleDlg026 = `111,170,078,012,EDITBOX,PW,DEFAULT,DEFAULT,12,DEFAULT,DEFAULT,DEFAULT,"255|255|%C26%"`

ButtonPushed = Dialog("SampleDlg")
Return

Article ID:   W17399
File Created: 2009:12:09:11:13:16
Last Updated: 2009:12:09:11:13:16