DOCUMENT #767
     ===========================================================================
     TRAPPING KEYSTROKES IN EEPS
     ===========================================================================
     PRODUCT:   R:BASE                     VERSION:  4.5+ or Higher
     ===========================================================================
     CATALOG:   Forms, Reports & Labels    AREA   :  Forms    
     ===========================================================================
 
     EEPs always execute when the placement action occurs -- a field is exited,
 
     a row is saved, etc. You can't keep the EEP code from executing, but you 
     can make it appear as if it did not execute by trapping for keystrokes and
 
     returning immediately to the form if certain keys were pressed, only 
     executing the remainder of the EEP code based on other keystrokes. 
 
     A conditional EEP is generally placed On exit from field. It is conditional 
     on the keystroke used to leave the field.
 
     When we use the terminology "execute the EEP" we mean that all the code in
 
     the EEP executes. The EEP always executes, but if it immediately returns you 
     to the form without performing any action, we say the EEP did not execute -- 
     it really did but it didn't do anything. 
 
     You can move off a field using the keystrokes: [Enter], [Down], [Up], [Tab], 
     and [Shift][Tab]. The [PgDn], and [PgUp] keys also move you off the field if 
     you are going to a second page of your form, but these keys are best 
     reserved for use with table level EEPs.
 
     Directional EEPs
 
     In its simplest implementation , trap the direction of cursor movement so 
 
     that an EEP executes when the user is moving forward but not backward 
     through the fields in a form. The EEP is placed On exit from field. The 
     code sample below illustrates this.
 
     *(FORWARD.EEP)
     IF (LASTKEY(0)) = '[UP]' OR +
        (LASTKEY(0)) = '[SHIFT][TAB]' THEN
          RETURN
     ENDIF
     *( EEP code to perform actions below here)
 
     Embedding these lines into the beginning of your EEP allows the user to 
     "pass over" the field when the user is moving backwards through the field 
 
     order. The EEP executes, but immediately returns to the form without 
     performing the coded actions. For example, if your EEP displayed a menu, 
     it would only display as the user moves down through the fields in the 
     form. If they backup, the menu does not display.
 
     Press a key to execute
 
     Another option is to trap for a deliberate keystroke on the field to cause
 
     it to execute the coded actions, rather than executing whenever passing 
     over the field. The keystrokes that work best for trapping deliberate 
     execution are [F2] and any [ALT] combination. Again, the EEP is placed 
     On exit from field. For example, establish "hot-keys" for the field as 
     illustrated in the code samples below.
 
     This code at the beginning of an EEP returns the user to the form unless 
     they have pressed F2. If the users presses the F2 key in the field, then 
     the rest of the EEP executes.
 
 
     IF (LASTKEY(0)) <> '[F2]' THEN
          RETURN
     ENDIF
     *( EEP code to perform actions below here)
 
     This code at the beginning of the EEP checks to see if the user press Alt-Q. 
     Any other keystroke returns to the user to the form and does not execute 
     the rest of the code in the EEP.
 
     IF (LASTKEY(0)) <> '[ALT]Q' THEN
          RETURN
      ENDIF
     *( EEP code to perform actions below here)
 
 
     The keys being trapped for can be combined into one IF...THEN statement as
 
     shown below.
 
     IF (LASTKEY(0)) NOT IN ('[F2]','[ALT]Q','[ALT]M') THEN
          RETURN
     ENDIF
     *( EEP code to perform actions below here)
 
     Using the new SET KEYMAP command of R:BASE 4.5 Plus!, remap various function 
     keys to act as [F2]. The F2 key moves the cursor off the field and triggers 
     the exit EEP. Then have the EEP further interrogate which function key was
 
     actually struck.  
 
     Before letting the user into the form, remap your function keys as shown 
     below.
 
     SET KEYMAP [F3] = [F2]
     SET KEYMAP [F4] = [F2]
     SET KEYMAP [F5] = [F2]
     SET KEYMAP [F6] = [F2]
     SET KEYMAP [F7] = [F2]
 
     In the EEP, trap for the LASTKEY(0) looking for [F2]. Then interrogate 
     LASTKEY(1) to find the actual keystroke used.
 
     IF (LASTKEY(0)) <> '[F2]' THEN
          RETURN
     ELSE
          IF (LASTKEY(1)) NOT IN ('[F4]','[F5]','[F6]','[F7]') THEN
               RETURN
          ENDIF
     ENDIF
     *( EEP code to perform actions below here
        different sections of code execute depending on
        the actual function key pressed )
 
     Execute different actions
 
     There are two basic methods to execute different actions in the EEP code. 
 
     You can include all the code in the EEP, or you can RUN a separate command
 
     file. Use either IF...THEN logic, or SWITCH...CASE logic to execute 
     subroutines within the same EEP. For example, 
     
     IF (LASTKEY(0)) <> '[F2]' THEN
          RETURN
     ELSE
          IF LASTKEY(1) NOT IN ('[F4]','[F5]','[F6]','[F7]') THEN
               RETURN
          ENDIF
     ENDIF
 
     IF (LASTKEY(1)) = '[F4]' THEN
          *( Execute code subroutine for [F4] action)
     ENDIF
 
     IF (LASTKEY(1)) = '[F5]' THEN
          *( Execute code subroutine for [F5]action)
     ENDIF
 
     IF (LASTKEY(1)) = '[F6]' THEN
          *( Execute code subroutine for [F6] action)
     ENDIF
 
     IF (LASTKEY(1)) = '[F7]' THEN
          *( Execute code subroutine for [F7] action)
     ENDIF
 
     RETURN
 
     Or use the SWITCH and CASE logic to affect the same ends.
 
     Rather than having the code actually stored within the EEP, have the EEP 
     call subroutines in other files. The advantage in using this method is that 
     your code will be cleaner and more modular. The disadvantage (which is in 
 
     turn an advantage for the previous method) is that having all code in one 
 
     EEP, you can see it all when editing the EEP code. This is useful when using 
     the new SHIFT-F4 to edit EEPs while modifying the form.
 
     IF (LASTKEY(0)) <> '[F2]' THEN
          RETURN
     ELSE
          IF LASTKEY(1) NOT IN ('[F4]','[F5]','[F6]','[F7]') THEN
               RETURN
          ENDIF
     ENDIF
 
     SWITCH (LASTKEY(1))
          CASE '[F4]' 
               RUN F4.EEP
               BREAK
          CASE '[F5]'
               RUN F5.EEP
               BREAK
          CASE '[F6]'
               RUN F4.EEP
               BREAK
          CASE '[F7]'
               RUN F5.EEP
               BREAK
     ENDSW