Tel:
(516) 796-6545 \ Fax: (516) 796-1273
E-Mail Me: doron@dfarber.com
Our Web Site: http://www.dfarber.com
This following article was published in FoxTalk on June 1994
Blank The Current
Field Using a Mouse Or Pen
I specialize in developing applications for
pen based computers, in conjuction with desktop computers.
BlankFld, the function
I will discuss here, allows a user to blank an input field in a
pen-based computer environment where a keyboard isn't available.
Or, in a desktop/ keyboard
environment, the user can blank a field with a single keystroke
or a mouse click.
The pen computer my clients use has a
character-based recognition (OCR) capability that is provided by
a product called Pen DOS. When Pen
DOS is active, FoxPro
recognizes pen actions, such as Dressing a control, just as it
would a mouse click.
However, one problem needs to be solved in
order to implement this capability. When the user presses a
button, that button becomes the current
object; VARREAD() no longer
returns the name of the field were in and the user wants to
blank.
Two memory variables can solve this
problem. NowField establishes the current field name. NowObj
keeps tracks of the current object number for
each field. It assures that
the cursor returns to the appropriate field. Both memory
variables are initialized in the screen setup code.
The following functions are called via the WHEN clause in each field:
*================================================== * Function........: FldData * Author..........: Doron Farber * Created.........: 01/06/94 * Purpose.........: Get the current active field namem, and current object number * Project.........: Common * Copyright.......: (c) The Farber Consulting Group *.Return Type.....: None * Notes...........: None *================================================== FUNCTION FldData m.NowField=VARREAD() && Store GET variable name m.NowObj=_CUROBJ && Store object number, too RETURN .T.
Otherwise, if you don't want to use a
button to activate BlankFld or want to provide a keyboard
alternative, you could use
a hot key or menu shortcut to activate the BlankFld function. The
hot key assignment might look like this:
ON KEY LABEL F5 DO BlankFld WITH VARREAD(),_CUROBJ
A menu shortcut might look like this:
DEFINE BAR 5 OF MyPop PROMPT
"\<Blank Field" KEY F5, '[F5]';
SKIP FOR EMPTY(VARREAD()) OR _CUROBJ =0
.
.
.
ON SELECTION BAR 5 OF MyPop
DO BlankFld WITH VARREAD(), _CUROBJ
If you do it this way exclusively, you
won't have to initiate NowField and NowObj as private memory
variables.
The name of the field and the current object number will be
passed as parameters.
BlankFld can blank both numeric and character fields. To execute BlankFld via a button you need a GET similar to this for the button:
0 19,48 GET m.AnyMemVar FUNCTION '*N \<BLANK' ;
DEFAULT 1 SIZE 1,7 WHEN MDOWN() VALID BlankFld()
The "WHEN MDOWN()" in this GET prevents the button from being selected or pressed by any means other than the mouse.
Page 2
Here is the BlankFld function:
*================================================== * Function........: BlankFld * Author..........: Doron Farber * Created.........: 01/06/94 * Purpose.........: To blank the current active field with one key * ................: Stroke * Project.........: Common * Copyright.......: (c) The Farber Consulting Group * Project.........: Common * Parameter List..: * m.WhichField....: Gets the current field name via VARREAD() * m.WhichObj. ....: Gets the current object number via _CUROBJ * Calling.........: * ................: a) ON KEY LABEL F5 DO BlankFld WITH VARREAD(),_CUROBJ * ................: b)0 19,48 GET m.AnyMemVar FUNCTION '*N \<BLANK' ; *.................: DEFAULT 1; SIZE 1,7 WHEN MDOWN() VALID BlankFld() *.................: c) Via a menu short cut *.Return Type.....: None * Notes...........: None *================================================== FUNCTION BlankFld PARAMETERS m.WhichField,m.WhichObj
* Next two lines are in case called from an OKL
SET TYPEAHEAD TO 0
PUSH KEY CLEAR
IF PARAMETERS()== 2 m.NowField = m.WhichField m.NowObj = m.WhichObj ENDIF
IF TYPE(EVALUATE('m.NowField')) ==’N’
STORE 0 TO (m.NowField)
ELSE
STORE SPACE(LEN(EVALUATE(m.NowField))) TO (m.NowField)
ENDIF
SHOW GET (m.NowField) ENABLE _CUROBJ = m.NowObj
*Next three lines are in case this routine was called from an OKL CLEAR TYPEAHEAD SET TYPEAHEAD TO 128 && or to whatever you like POP KEY RETURN .T.
Notice the code that prevents unwanted recursion of ON KEY LABEL (OKL) handlers (see the sidebar, "Prevent OKL Recursion Every Time").
Notice also how STORE statements stuff the
new value into the GET variable for the field to be blanked. This
way a named reference can be
used instead of a macro
expansion. If the "=" operator were used in place of
STORE, you'd have to use a slower macro expansion.
&NowField = SPACE(LEN(EVALUATE(m.NowField)))
This is because named references are illegal on the left side of an assignment statement; they generate an "Unrecognized Command Verb" error.