Microsoft KB Archive/98754

= How to Prevent Recursion Within ON KEY LABEL Routines =

Article ID: 98754

Article Last Modified on 12/3/2003

-

APPLIES TO


 * Microsoft Visual FoxPro 3.0 Standard Edition
 * Microsoft FoxPro 2.5b
 * Microsoft FoxPro 2.5a
 * Microsoft FoxPro 2.0
 * Microsoft FoxPro 2.5b for MS-DOS
 * Microsoft FoxPro 2.5a

-



This article was previously published under Q98754



SYMPTOMS
If a key that is assigned to an ON KEY LABEL procedure is pressed while that same procedure is executing, an undesirable recursive condition will be created. If this same key is accidentally held down, the typematic function of MS-DOS (the rate at which MS-DOS repeats a character when you hold down a key) may fill the keyboard buffer with as many as 31 keystrokes.

After attempting to DO the procedure as many times as possible, the program will abort with the message &quot;DO nesting too deep.&quot;



RESOLUTION
To work around this problem, turn off the key trap at the beginning of the procedure, then set it back on again as the procedure is exited. The sample program below demonstrates this workaround.



MORE INFORMATION
The simplest method of disabling an ON KEY LABEL trap is to assign the asterisk (*) to the same key label that originally called the currently executing procedure. This assignment should be the very first line of the procedure, provided there are no parameters to be passed, in which case it should immediately follow the PARAMETERS statement.

After the routine has completed its operation, the key can be reassigned to its previous command to DO the procedure. This reassignment should be the last line in the procedure before the (implied or written) RETURN statement. *** XYZ.PRG PUSH KEY CLEAR && Clears and saves current ON KEY LABEL settings ON KEY LABEL F5 DO abc  && original assignment in main program

&&  && body of main program &&

* (To run this code as a stand-alone program, place a READ CYCLE  * command here).

* Place the POP KEY command immediately before the RETURN (if one  * exists) or the end of the main program. POP KEY && Restores ON KEY LABEL settings

PROCEDURE abc ON KEY LABEL F5 *  && reassigns F5 to a comment *... other code WAIT WINDOW &quot;pressing F5 now won't call this procedure again&quot; *... more code ON KEY LABEL F5 DO abc  && reassigns F5 to its original trap NOTE: While this method prevents recursive calls from within a procedure, on some very fast machines this method will not prevent the procedure call stack from overflowing. The &quot;DO nesting too deep&quot; error cannot be trapped by an ON ERROR routine, as the ON ERROR routine must place its call on the same stack.

Additional query words: VFoxWin FoxDos FoxWin OKL clear typeahead hotkey hot type ahead tshoot

Keywords: kbcode KB98754

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.