Subject Re: Entryfield Valid won't work
From Mervyn Bick <invalid@invalid.invald>
Date Thu, 10 Jan 2019 08:35:19 +0200
Newsgroups dbase.getting-started

On 2019-01-10 6:49 AM, Norman Snowden wrote:
>   Update: I am sorry to have posted about this problem. It is now fixed. I can't understand why. Searching for any solution by a lucky trial I reversed the sequence placing the "S" first as: If this.value = "S" or this.value = "N"
>     test = true
> Sorry about this. Maybe I need to be a nicer person!

Mm, never sell yourself short.  You've got to be nicer than some of the
old curmudgeons I know.  :-)

Your problem may have been caused by a typo.  In the code snippets you
posted, the N was uppercase but the S was lowercase.  When you retyped
them in reverse order (which should not have affected the code at all)
you probably made the S uppercase as well.

If the rest of your program will accept N, n, S or s you can change the
Valid test to

   Function ENTRYFIELD86_valid()
      *ns9
      Test = false
      If upper(this.value) = “N” or upper(this.value) = “S”
        Test = true
      endif
      return test

If the rest of the program requires N and S to be upper case you can use
the entryfield's KEY event handler to force lowercase characters to
uppercase.

    function ENTRYFIELD86_key(nChar, nPosition,bShift,bControl)
       if nChar >= 97 and nChar <= 122 // i.e from a to z
          nChar -= 32  //Subtract 32 to give the uppercase character
       endif
       //Only characters a to z are changed.  Numerals returned unchanged
       return chr(nChar)


Where you have so many controls all using identical event handlers you
can remove a lot of "clutter" from your code by having just one event
handler which you then assign to each control.  When Henry Ford built
his first petrol engine it only had one cylinder.  His reason for this
was "If anything goes wrong I know where to look."  The same applies
here. :-)


   this.ENTRYFIELD87 = new ENTRYFIELD(this)
      with (this.ENTRYFIELD87)
        VALID = class::ENTRYFIELD_VALID
         KEY = class::ENTRYFIELD_KEY
         datalink = form.area1.rowset.fields[“ns10”]
         height = 0.1771
         left = 0.92
         top = 2.87
         width = 0.1771
         function = “!”
         fontsize = 8.0
         fontbold = true
      endwith


   Function ENTRYFIELD_valid()
      Test = false
      If this.value = “N” or this.value = “S”
        Test = true
      endif
      return test


    function ENTRYFIELD_key(nChar, nPosition,bShift,bControl)
       if nChar >= 97 and nChar <= 122 // i.e from a to z
          nChar -= 32  //Subtract 32 to give the uppercase character
       endif
       //Only characters a to z are changed.  Numerals returned unchanged
       return chr(nChar)


If you change the constructor code for the first entryfield you can then
mark and copy the two lines where the VALID and KEY event handlers are
assigned.  Then simply paste them over the VALID entry in the
constructor code for the remaining entryfields.  Once you've done this
you can remove all the unneeded event handlers.

The next time you need to build a form with so many entryfields all of
which require identical event handlers remember that this is the ideal
situation in which to use a custom control.  It will only take a few
minutes to create a suitable custom entryfield control and after that
you simply place as many instances as you need without any further
programming.

I note that you are using inverted commas i.e “N” rather than quotation
marks "N" to delimit the characters.  If it works for you it's not wrong
but I'm surprised that dBASE will accept this.  My computer gets
thoroughly upset.

Mervyn.