home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload / ShartewareOverload.cdr / database / tmenu.zip / OPTMENU.PRG
Text File  |  1986-10-22  |  7KB  |  174 lines

  1.  
  2.               *****************************************************
  3.               *    SPECIAL THANKS TO ALAN SIMPSON'S FINE BOOK     *
  4.               *     "ADVANCED TECHNIQUES IN dBASE III PLUS"       *
  5.               *    THAT INSPIRED ME TO WRITE THIS PROCEDURE.      *
  6.               *****************************************************
  7.  
  8. * ---------------------------------------------------------------------------
  9. * DISPLAY AN OPTION MENU, AND FETCH CHOICE BY USING CURSOR UP/DOWN OR NUMBER
  10. * ---------------------------------------------------------------------------
  11. * DATE: 10/22/86
  12. *
  13. * PROGRAMMER: D. L. Raney                   (GEnie address: D.L.RANEY)
  14. *             2612 CASTLE DR.                          also
  15. *             BLUE SPRINGS, MO. 64015       (The Programmers Exchange BBS)
  16. *                                           (        816-228-1957        )
  17. *
  18. * LANGUAGE: dBIII+
  19. *
  20. * PURPOSE: To present user with a highlight bar menu option list. Using this
  21. *          they may use the cursor keys to select, or press an entry number.
  22. *
  23. * USE: This procedure may be used to display any menu with up to 9 options.
  24. *      The option strings for prompts must be set before calling this
  25. *      procedure.
  26. *      EXAMPLE:
  27. *                          OPT1='1. Append record'
  28. *                          OPT2='2. Edit record'
  29. *                          And so on........ Up to 9 options (OPT9)
  30. *
  31. *      You must call it with two parameters. The first will return the number
  32. *      that the user selected. The second is used internally by the procedure
  33. *      to display the correct number of options and return a number within
  34. *      that range. An example of the proper way to call this procedure is,
  35. *      EXAMPLE:
  36. *               SELECTION = 0
  37. *               DO WHILE SELECTION # 3
  38. *                  OPTHEADER = 'MAIN MENU TRAVEL SYSTEM DATA BASE'
  39. *                  OPT1 = '1. Add records to data base'
  40. *                  OPT2 = '2. Edit records in data base'
  41. *                  OPT3 = '3. Exit to system'
  42. *                  DO FETCH_OPT WITH SELECTION, 3
  43. *                     DO CASE
  44. *                        CASE SELECTION = 1
  45. *                             DO APPENDREC  && --- MAY ALSO USE FETCH_OPT
  46. *                        CASE SELECTION = 2
  47. *                             DO EDITREC    && --- MAY ALSO USE FETCH_OPT
  48. *                     ENDCASE
  49. *               ENDDO
  50. *
  51. *      END OF EXAMPLE
  52. *
  53. * INPORTANT NOTE: Make sure the variables OPT1-9 and OPTHEADER are
  54. *                 GLOBAL variables.
  55. *                 Also, the OPTHEADER must not be longer than 50
  56. *                 characters. This because the procedure will auto-
  57. *                 maticly append the system date and time to the
  58. *                 string. If OPTHEADER is "MAIN MENU", then the out
  59. *                 put would be similar to the following,
  60. *
  61. *                 "MAIN MENU  DATE:10/22/86  TIME:01:15:54"
  62. *
  63. * ---------------------------------------------------------------------------
  64.  
  65.  
  66. PROCEDURE FETCH_OPT
  67. PARAMETERS CHOICE, NUMOPT
  68.  
  69. * ------- CHOICE RETURN SELECTION NUMBER PICKED
  70. * ------- NUMOPT TELLS PROGRAM HOW MANY OPTIONS TO DISPLAY
  71.  
  72. * ---------------------------------------------------------------------------
  73. *                  INITIALIZE THE PROGRAM AND VARIABLES
  74. * ---------------------------------------------------------------------------
  75.  
  76. PRIVATE DONE, CNT, MAXOPTLEN
  77. DONE = .F.      && USED FOR MAIN LOOP TEST FOR RETURN
  78. CNT = 1         && USED AS A LOOP COUNTER
  79. MAXOPTLEN = 0   && USED TO FIND A CENTERING POINT FOR OPTION LIST
  80. OPTCOL = 0      && ALL OPTIONS START AT THIS COLUMN POINTER
  81.  
  82. * ---------------------------------------------------------------------------
  83. * FIND LENGTH OF THE LONGEST OPTION PARAMETER
  84. * SHOULD TELL US THE LONGEST STRING LENGTH SO WE CAN CENTER ALL AVALABLE
  85. * OPTIONS ON THE SCREEN
  86. * ---------------------------------------------------------------------------
  87.  
  88. DO WHILE CNT <= NUMOPT
  89.    SUB = STR(CNT,1)
  90.    IF LEN(OPT&SUB) > MAXOPTLEN
  91.       MAXOPTLEN = LEN(OPT&SUB)
  92.    ENDIF
  93.    CNT = CNT + 1
  94. ENDDO ( CNT )
  95. OPTCOL = (INT((79-MAXOPTLEN)/2))
  96.  
  97. *----------------------------------------------------------------------------
  98. *                          DISPLAY OPTION LIST
  99. *----------------------------------------------------------------------------
  100.  
  101. CNT = 1
  102. CLEAR
  103. OPTHEADER = OPTHEADER + ' Date:' + DTOC(DATE()) + '  Time:' + TIME()
  104. @ 1,0 TO 3,79 DOUBLE  && DRAW TITLE BOX
  105. @ 2,(INT((79-LEN(OPTHEADER))/2)) SAY OPTHEADER   && ---- CENTERED HEADER
  106. @ 5,0 TO (8+NUMOPT),79 DOUBLE                    && ---- FRAME OPTIONS LIST
  107. DO WHILE CNT <= NUMOPT
  108.    SUB = STR(CNT,1)
  109.    @ (6+CNT),OPTCOL SAY OPT&SUB
  110.    CNT = CNT + 1
  111. ENDDO ( CNT )
  112.  
  113. * ---------------------------------------------------------------------------
  114. *             DISPLAY INSTRUCTIONS WITH GRAPHICS CHARACTERS
  115. * ---------------------------------------------------------------------------
  116.  
  117. @ (9+NUMOPT),0 TO (12+NUMOPT),79 DOUBLE    && ---- FRAME HELP SCREEN
  118. @ (10+NUMOPT),18 SAY 'Highlight option by using'
  119. @ (10+NUMOPT),44 SAY CHR(24) + ' or ' + CHR(25) + ' and press ' + CHR(17) + CHR(217)
  120. @ (11+NUMOPT),22 SAY 'or press appropriate menu number.'
  121.  
  122.  
  123. *----------------------------------------------------------------------------
  124. *                      INITIALIZE MEMORY VARIABLES
  125. *----------------------------------------------------------------------------
  126.  
  127. OPT = 1
  128. SUB = STR(OPT,1)
  129. KEYPRESS = 0
  130. CHOICE = 0
  131.  
  132. * ----------- SET REVERSE VIDEO ON NUMBER ONE
  133. @ (6+OPT),OPTCOL GET OPT&SUB
  134. CLEAR GETS
  135.  
  136. * ----------- LOOP FOR SELECTING MENU OPTIONS
  137.  
  138. DO WHILE .NOT. DONE
  139.  
  140.    * ------- WAIT FOR KEYPRESS
  141.    KEYPRESS = 0
  142.    DO WHILE KEYPRESS = 0
  143.       KEYPRESS = INKEY()
  144.    ENDDO ( KEYPRESS )
  145.  
  146.    * ------- ARROW KEY PRESSED
  147.    IF KEYPRESS = 24 .OR. KEYPRESS = 5
  148.       @ OPT+6,OPTCOL SAY OPT&SUB
  149.       OPT = IIF(KEYPRESS = 24, OPT+1,OPT-1)
  150.       OPT = IIF(OPT > NUMOPT, 1, OPT)
  151.       OPT = IIF(OPT < 1, NUMOPT, OPT)
  152.       SUB = STR(OPT,1)
  153.       @ OPT+6,OPTCOL GET OPT&SUB
  154.       CLEAR GETS
  155.       LOOP      && CHOICE NOT MADE, GO BACK FOR MORE INPUT
  156.    ENDIF
  157.  
  158.    * ------- OPTION NUMBER ENTERED
  159.    IF KEYPRESS >= 49 .OR. KEYPRESS <= (NUMOPT+48)
  160.       CHOICE = KEYPRESS - 48
  161.    ENDIF
  162.  
  163.    * ------- RETURN KEY PRESSED
  164.    IF KEYPRESS = 13
  165.       CHOICE = OPT
  166.    ENDIF
  167.  
  168.    * ------- AN OPTION WAS SELECTED
  169.    IF CHOICE > 0 .AND. CHOICE <= NUMOPT
  170.       DONE = .T.
  171.    ENDIF
  172. ENDDO ( DONE )
  173. RETURN
  174.