home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / CLIPPER / MISC / MAKEHELP.ZIP / MAKEHELP.PRG < prev   
Encoding:
Text File  |  1987-01-27  |  17.8 KB  |  607 lines

  1. * MAKEHELP.PRG
  2. *
  3. * Used to create and maintain HELP messages for use with CLIPPER'ed programs.
  4. * These are the program's functions:
  5. *
  6. *    EDIT (add new message, or modify existing message)
  7. *    SUBSTRING data into a report
  8. *       DELETE message or entire record
  9. *       DISPLAY memo field for a variable without allowing changes
  10. *
  11. * Database layout for both input and resulting files:
  12. *
  13. *       Database: xxxxxHLP.DBF - 2 fields, HELP_VAR (c 10), HELP_MSG (memo)
  14. *       Index:    xxxxxHLP.NTX - Key:      HELP_VAR 
  15. *       ('xxxxx' in the file names are the 1-to5 character system acronym)
  16. * Creation:
  17. *    Randy Richter, CALCULON Corporation, March 17, 1986
  18. * Revision:
  19. *    Randy Richter, 8/19/86: Modify to use PARMSET programming conventions
  20. *    Randy Richter, 8/28/86: Revise SUBSTRING to improve performance;
  21. *                            Add 'END OF MESSAGE' automatically to messages;
  22. *                            Strip 'END OF MESSAGE' prior to change
  23. *    Randy Richter, 9/2/86:  Combine former ADD and CHANGE options into 
  24. *                            one EDIT option;  create new CHANGE FILES option.
  25. *    Randy Richter,10/15/86: Expand name field for database to provide space
  26. *                            for inclusion of drive and path.
  27. *    Randy Richter, 1/2/87:  Update exit routine to clean up memo storage.
  28. *    Randy Richter, 1/27/87: Show all current HELP_VARs on <F1> from entry
  29. *                            screen, as part of help message.
  30. *
  31. external memotran     
  32. set echo off
  33. set debug off
  34. set confirm off
  35. set scoreboard off
  36. restore from makehelp      && Get parameter variables
  37. public sys_pgm, sys_dir, sys_acronm, sys_norm, sys_invers, sys_invers, all_var
  38. public fname, build_nme, sc_color, chg_doen, del_done, pagex, linex
  39. build_nme = space(17)
  40. chg_done = .F.             && Flag for 'changes have been made'
  41. del_done = .F.             && Flag for 'deletions have been done'
  42. do painter with [HELP MESSAGE CREATION UTILITY]
  43. do chng_fil                     && Define HELP file to be used
  44. var = [          ]
  45. menu_done = .F.
  46. do while .not. menu_done
  47.    do setcolor with [&sys_norm]
  48.    clear
  49.    do painter with [HELP MESSAGE CREATION UTILITY]
  50.    @ 8,30 prompt [EDIT a new or existing message]
  51.    @ 9,30 prompt [DELETE a message]
  52.    @10,30 prompt [PRINT all messages]
  53.    @11,30 prompt [SHOW a message]   
  54.    @12,30 prompt [CHANGE help files]
  55.    @13,30 prompt [QUIT]
  56.    menu to choice
  57.    do case
  58.       case choice = 1
  59.          do EDIT
  60.       case choice = 2
  61.          do DELETE
  62.       case choice = 3
  63.          do SUBSTRING
  64.       case choice = 4
  65.          do SHOW_MEM
  66.       case choice = 5
  67.          do painter with [CHANGE HELP FILE]
  68.          do CHNG_FIL
  69.       case choice = 6 .or. choice = 0
  70.          menu_done = .t.
  71.          do exit_proc
  72.    endcase
  73.    keyboard ""
  74. enddo
  75. close databases
  76. clear
  77. cancel
  78.  
  79.  
  80. PROCEDURE EDIT
  81. *
  82. * CASE 1:  ADD NEW DATA OR CHANGE EXISTING DATA
  83. * Logic:   If no record exists, append blank and replace appropriate data.
  84. *          If record exists, edit existing message.  Note that a <CR>, 31
  85. *          spaces, and 'END OF MESSAGE' are added to the end of each message
  86. *          it is written as a visual reminder to user; these do not display
  87. *          during message creation.
  88. *          
  89. do setcolor with [&sys_norm]
  90. clear
  91. do painter with [EDIT MESSAGE]
  92. done_edit = .F.
  93. do while .not. done_edit
  94.    do setcolor with [&sys_norm]
  95.    set function 2 to 
  96.    set key 28 to HELP
  97.    @ 11,0 clear
  98.    var = [          ]
  99.    @ 10,1 say [ENTER VARIABLE NAME: ] get var picture [!!!!!!!!!!] 
  100.    read
  101.    if lastkey() = 27 .or. len(trim(var)) = 0
  102.       done_edit = .T.
  103.       exit
  104.    endif
  105.    seek upper(var)
  106.    do setcolor with [&sys_invers]
  107.    frame = chr(201) + chr(205) + chr(187) + chr(186) + chr(188) + ;
  108.            chr(205) + chr(200) + chr(186)
  109.    @ 14,0,21,79 box frame
  110.    @ 21,16 say "  Press <F2> to SAVE message, or <ESC> to quit.  "
  111.    set key 28 to
  112.    set function 1 to
  113.    set function 2 to chr(23)
  114.    if .not. found()
  115.       temp_msg = memoedit(help_msg,15,1,20,78,.T.) + chr(13) + ;
  116.             space(31) + 'END OF MESSAGE'
  117.       if len(trim(var)) > 0
  118.          append blank
  119.          replace help_var with var
  120.          replace help_msg with temp_msg
  121.          if at("No variables are currently defined in this database...",all_var) > 1
  122.             all_var = substr(all_var,1,at("No variables are currently defined in this database...",all_var)-1) + ;
  123.               "Variables currently in this file include:" + chr(13) + chr(10)        
  124.          endif
  125.          all_var = all_var + var + space(10-len(var))
  126.       endif
  127.    else
  128.       chg_done = .T.
  129.       temp_msg = substr(help_msg,1,at('END OF MESSAGE',help_msg)-31)
  130.       new_msg = memoedit(temp_msg,15,1,20,78,.T.) + chr(13) + ;
  131.            space(31) + 'END OF MESSAGE' 
  132.       replace help_msg with new_msg 
  133.    endif
  134. enddo while .not. done_edit
  135. set function 2 to
  136. return
  137.    
  138.  
  139. PROCEDURE DELETE
  140. *
  141. * CASE 2: DELETE DISCUSSION WITHIN EXISTING RECORD OR ENTIRE RECORD
  142. *
  143. do setcolor with [&sys_norm]
  144. clear
  145. do painter with [DELETE HELP MESSAGE]
  146. done_del = .F.             && Flag for 'all done with deletions menu choice'
  147. do while .not. done_del
  148.    var = [          ]
  149.    @ 10,1 say [ENTER VARIABLE NAME: ] get var picture [!!!!!!!!!!] 
  150.    read
  151.    if lastkey() = 27 .or. len(trim(var)) = 0
  152.       done_del = .T.
  153.       exit
  154.    endif
  155.    seek upper(var)
  156.    if found()
  157.       and_var = "N"
  158.       @ 12,1 say [DO YOU WISH TO DELETE THE ENTIRE RECORD ? ] get and_var picture '!'
  159.       read
  160.       if lastkey() = 27
  161.          return
  162.       endif
  163.       if and_var <> "Y"
  164.          @ 12,1 say "Deleting the record's help message only, please be patient..."
  165.          new_var = help_var
  166.          delete
  167.          append blank
  168.          replace help_var with new_var
  169.          pack
  170.          done = .T.
  171.          @ 12,1 say space(78)
  172.       else
  173.          @ 12,1 say "Deleting the entire record, please be patient..."
  174.          delete
  175.          del_done = .T.
  176.          pack
  177.          done = .T.
  178.          @ 12,1 say space(78)
  179.       endif
  180.    else
  181.       do setcolor with [&sys_says]
  182.       @ 12,1 say "Record not found..."
  183.       set console off
  184.       ? inkey(5)
  185.       set console on
  186.       do setcolor with [&sys_norm]
  187.       @ 12,1 say space(25)
  188.       loop
  189.    endif
  190. enddo while .not. done_del
  191. return
  192.  
  193.  
  194. PROCEDURE SUBSTRING
  195. *
  196. * CASE 3: PRINT REPORTS WITH SUBSTRING
  197. *
  198. do setcolor with [&sys_norm]
  199. clear
  200. do painter with [PRINT HELP MESSAGES]
  201. declare memarray[256]               && LIMITING VALUE; MAY NEED TO CHANGE
  202. count to numrecs
  203. go top
  204. if numrecs > 0
  205.    @ 11,1 say "This HELP file contains " + str(numrecs,3) + " messages."
  206.    @ 14,10 prompt "BEGIN printing or "
  207.    @ 14,28 prompt "RETURN to the Main Menu"
  208.    menu to pchoice
  209.    if pchoice = 2
  210.       return
  211.    endif
  212. else
  213.    do setcolor with [&sys_says]
  214.    @ 12,1 say "Record not found..."
  215.    set console off
  216.    ? inkey(5)
  217.    set console on
  218.    do setcolor with [&sys_norm]
  219.    @ 12,1 say space(25)
  220.    return
  221. endif
  222. @ 14,10 say 'Press <ESC> to stop printing at any time.'
  223. linex=1
  224. pagex=1
  225. keyboard ""
  226. do header
  227. msgctr = 1
  228. do while .not. eof()
  229.    set console off
  230.    ? inkey(1)
  231.    set console on
  232.    if lastkey() = 27
  233.       yn = 'N'
  234.       @ 14,1 say space(78)
  235.       @ 14,1 say 'Continue printing (Y/N)? ' get yn picture '!'
  236.       read
  237.       if yn = 'N'
  238.          eject
  239.          return
  240.       else
  241.          @ 14,1 say space(78)
  242.          @ 14,10 say 'Press <ESC> to stop printing at any time.'
  243.       endif
  244.    endif
  245.    keyboard ""
  246.    @ 12,1 say space(78)
  247.    @ 12,1 say "Now printing message " + str(msgctr,2) + space(3)
  248.    temp_msg = substr(help_msg,1,at('END OF MESSAGE',help_msg)-31)
  249.    set color to B/B,B/B,B/B,B
  250.    newmem = memotran(memoedit(temp_msg,18,1,24,78,.F.),' ',' ')
  251.    do setcolor with [&sys_norm]
  252.    arrayctr = 1
  253.    DLINECTR = 1
  254.    DO WHILE .NOT. DLINECTR > LEN(NEWMEM)
  255.       IF DLINECTR + 77 < LEN(NEWMEM)
  256.          LAST_SP = LAT(" ",SUBSTR(NEWMEM,DLINECTR,78))
  257.          IF LAST_SP > 0
  258.             MEMARRAY[ARRAYCTR] = SUBSTR(NEWMEM,DLINECTR,LAST_SP - 1)
  259.             DLINECTR = DLINECTR + LAST_SP 
  260.             ARRAYCTR = ARRAYCTR + 1
  261.          ELSE
  262.             MEMARRAY[ARRAYCTR] = SUBSTR(NEWMEM,DLINECTR,77)
  263.             DLINECTR = DLINECTR + 77 
  264.             ARRAYCTR = ARRAYCTR + 1
  265.          ENDIF LAST_SP > 0
  266.       ELSE
  267.          MEMARRAY[ARRAYCTR] = SUBSTR(NEWMEM,DLINECTR)
  268.          DLINECTR = LEN(NEWMEM) + 1
  269.          ARRAYCTR = ARRAYCTR + 1
  270.       ENDIF DLINECTR + 77 <= LEN(NEWMEM)
  271.    ENDDO WHILE .NOT. DLINECTR > LEN(NEWMEM)
  272.    * End of substringing section.  Note that ARRAYCTR is 1 more than # of 
  273.    * elements in the array.
  274.    if linex + arrayctr > 58
  275.       do header
  276.    endif
  277.    set device to print
  278.    set print on
  279.    set console off
  280.    @ linex,35 say upper(help_var)
  281.    linex = linex + 2
  282.    lctr = 1
  283.    do while lctr < arrayctr
  284.       @ linex,1 say memarray[lctr]
  285.       lctr = lctr + 1
  286.       linex = linex + 1
  287.    enddo
  288.    linex = linex + 2
  289.    set device to screen
  290.    set print off
  291.    set console on
  292.    if .not. eof()
  293.       skip
  294.    endif
  295.    msgctr = msgctr + 1
  296. enddo
  297. @ 11,1 say space(78)
  298. @ 12,1 say space(78)
  299. return
  300.  
  301.  
  302. PROCEDURE SHOW_MEM
  303. *
  304. * CASE 4: DISPLAY MEMO FIELD WITHOUT ALLOWING CHANGES
  305. *
  306. do setcolor with [&sys_norm]
  307. clear
  308. do painter with [DISPLAY HELP MESSAGE]
  309. done_show = .F.
  310. do while .not. done_show
  311.    do setcolor with [&sys_norm]
  312.    @ 11,0 clear
  313.    var = [          ]
  314.    @ 10,1 say [ENTER VARIABLE NAME: ] get var picture [!!!!!!!!!!] 
  315.    read
  316.    if lastkey() = 27 .or. len(trim(var)) = 0
  317.       done_show = .T.
  318.       exit
  319.    endif
  320.    seek upper(var)
  321.    save screen
  322.    if found()
  323.       set key 28 to                   && TURN OFF HELP FEATURE TO AVOID W '85 BUG
  324.       set function 1 to chr(23)       && DEFINE F1 AS CTRL-U
  325.       go_on = .F.
  326.       frame = chr(201) + chr(205) + chr(187) + chr(186) + chr(188) + ;
  327.               chr(205) + chr(200) + chr(186)
  328.       @ 21,0,24,79 box frame
  329.       do setcolor with [&sys_says]
  330.       @ 24,23 say "  PRESS <F1> TO EXIT FROM HELP  "
  331.       keyboard ""
  332.       if "" = memoedit(help_msg,22,1,23,78,.T.)
  333.       endif
  334.       do setcolor with [&sys_norm]
  335.       restore screen
  336.       done = .T.
  337.       set key 28 to help
  338.    else
  339.       do setcolor with [&sys_says]
  340.       @ 12,1 say "Record not found..."
  341.       set console off
  342.       ? inkey(5)
  343.       set console on
  344.       do setcolor with [&sys_norm]
  345.       @ 12,1 say space(25)
  346.       loop
  347.    endif
  348. enddo while .not. done_show
  349. return
  350.  
  351.  
  352. PROCEDURE CHNG_FIL
  353. *
  354. *  CASE 5:  CHANGE HELP FILES
  355. *
  356. do setcolor with [&sys_norm]
  357. @  4,0 clear
  358. @ 22,20 say 'PRESS <F1> FOR HELP AT ANY INPUT PROMPT'
  359. done_name = .F.
  360. @ 11,18 say 'Enter the system acronym: '
  361. do while .not. done_name
  362.    @ 14,10 say space(68)
  363.    @ 11,44 get build_nme picture '@!'
  364.    read
  365.    if len(trim(build_nme)) = 0 .or. at('.',build_nme) > 0
  366.       @ 14,12 say 'Sorry, you must enter a valid acronym...'
  367.       set console off
  368.       ? chr(7)
  369.       ? inkey(5)
  370.       set console on
  371.       loop
  372.    else
  373.       fname = trim(build_nme) + 'HLP'
  374.       done_name = .T.
  375.    endif
  376.    if file('&fname..DBF')
  377.       select 1
  378.       use &fname 
  379.       if file('&fname..NTX')
  380.          use &fname index &fname
  381.       else
  382.          index on help_var to &fname
  383.          use &fname index &fname
  384.       endif
  385.       go top
  386.       count to numrecs
  387.       go top
  388.       @ 14,18 say "This HELP file contains " + str(numrecs,3) + " records."
  389.       go top
  390.       if numrecs > 0
  391.          all_var = chr(13) + chr(10) + "Variables currently in this file include:" + chr(13)
  392.          do while .not. eof()
  393.             all_var = all_var + help_var + space(11-len(help_var))
  394.             skip
  395.          enddo
  396.       else
  397.          all_var = chr(13) + chr(10) + "No variables are currently defined in this database..."
  398.       endif
  399.       set console off
  400.       ? inkey(5)
  401.       set console on
  402.    else
  403.       use MAKEHLP 
  404.       copy structure to &fname
  405.       use &fname
  406.       index on help_var to &fname
  407.       select 1
  408.       use &fname index &fname
  409.       all_var = chr(13) + chr(10) + "No variables are currently defined in this database..."
  410.    endif
  411. enddo while .not. done_name
  412. return
  413.  
  414.  
  415. PROCEDURE EXIT_PROC
  416. *
  417. *  CASE 6: CLEAN UP DATABASES AND EXIT
  418. *  Logic:  If any text has been changed or deleted, EXIT_PROC copies the old
  419. *          memo data into a new file, then renames to the old; this makes for
  420. *          more efficient use of space...
  421. *
  422. if del_done .or. chg_done
  423.    do painter with [UPDATING THE DATABASE]
  424.    @ 14,24 say 'This will take several minutes;'
  425.    @ 15,24 say 'please be patient.'
  426.    if del_done            
  427.       pack
  428.    endif
  429.    copy structure to maketemp
  430.    copy to maketemp 
  431.    use
  432.    erase &fname..dbf
  433.    erase &fname..dbt
  434.    erase &fname..ntx
  435.    rename maketemp.dbf to &fname..dbf
  436.    rename maketemp.dbt to &fname..dbt
  437.    use &fname
  438.    index on help_var to &fname  && We're exiting, so don't need to use index...
  439. endif
  440. return
  441.  
  442.  
  443. *
  444. * END OF MAIN PROGRAM - subroutines and functions follow
  445. *
  446.  
  447.  
  448. PROCEDURE PAINTER
  449. *  Syntax:  DO PAINTER WITH [screen title]
  450. *  Based on routine by Tom Landini, modified for Clipper by Randy Richter
  451. *
  452. PARAMETERS PTITLE
  453. CLEAR
  454. do setcolor with [&sys_invers]
  455. frame = chr(201) + chr(205) + chr(187) + chr(186) + chr(188) + ;
  456.         chr(205) + chr(200) + chr(186)
  457. @ 0,0,3,79 box frame
  458. @ 1,1 say space(78)
  459. @ 2,1 say space(78)
  460. @ 2,2 SAY PTITLE
  461. @ 2,66 SAY AMPM(TIME())
  462. do setcolor with [&sys_norm]
  463. RETURN
  464.  
  465. PROCEDURE HEADER
  466. *  Simple routine to print report header; accepts no parameters
  467. *
  468. SET DEVICE TO PRINT
  469. SET PRINT ON
  470. SET CONSOLE OFF
  471. EJECT
  472. @ 1,1 SAY DATE()
  473. @ 1,20 SAY 'HELP MESSAGE LISTING FOR THE ' + TRIM(BUILD_NME) + ' SYSTEM'
  474. @ 1,72 SAY AMPM(TIME())
  475. @ 2,36 SAY 'Page ' + STR(PAGEX,2)
  476. @ 4,1 SAY REPLICATE('-',78)
  477. @ 5,20 SAY '           VARIABLE NAME'
  478. @ 7,20 SAY '*********  HELP  MESSAGE  *********'
  479. @ 8,1 SAY REPLICATE('-',78)
  480. LINEX = 10
  481. PAGEX = PAGEX + 1
  482. SET DEVICE TO SCREEN
  483. SET PRINT OFF
  484. SET CONSOLE ON
  485. RETURN
  486.  
  487. FUNCTION AMPM
  488. * Syntax: AMPM( <time string> )
  489. * Return: An 11 byte character string with the time in a 12-hour am/pm format. 
  490. * Revised 8/19/86 by Randy Richter to return only "HH:MM xM"
  491. *
  492. PARAMETERS cl_time
  493. RETURN IF( VAL(cl_time)<12, substr(cl_time,1,5-(8-len(cl_time))) + " am",;
  494.            IF(    VAL(cl_time)=12, substr(cl_time,1,5) + " pm",;
  495.               STR(VAL(cl_time)-12,2) + SUBSTR(cl_time,3,3) + " pm" ) )
  496.  
  497. FUNCTION LAT
  498. * Syntax: LAT( string to look for, string to look in)
  499. * Returns numeric value defining rightmost position of a string
  500. * within a string. 
  501. *
  502. * Randy Richter  4/30/86
  503. *
  504. PARAMETERS FIND_VAL,WHOLE
  505. POS=LEN(WHOLE)
  506. PLACE = 0
  507. DO WHILE POS > 1
  508.    POS = POS - 1
  509.    FOUND_VAL =  SUBSTR(WHOLE,POS,LEN(FIND_VAL))
  510.    IF FOUND_VAL = FIND_VAL   
  511.       PLACE = POS
  512.       EXIT
  513.    ENDIF
  514. ENDDO
  515. RETURN PLACE
  516.  
  517. PROCEDURE SETCOLOR
  518. * Does nothing more then SET COLOR to the parameter passed.
  519. * This provides a means of determining the current color setting to insure
  520. * correct color setting on return from HELP.
  521. *
  522. * Randy Richter, 9/2/86
  523. *
  524. PARAMETERS SCRN_COLOR
  525. SC_COLOR = SCRN_COLOR
  526. SET COLOR TO &SCRN_COLOR
  527. RETURN
  528.  
  529. PROCEDURE HELP
  530. * HELP.PRG
  531. *
  532. * SUMMARY:  This is a generic help routine, usable only with CLIPPER.  Help
  533. * messages are displayed in a box on lines 21 through 24, allowing for a 
  534. * 2-line "window".  
  535. *
  536. * DATABASE STRUCTURE:  HELP uses one database, named "xxxxxHLP.DBF" (with
  537. * "xxxxx" replaced by the 1-to-5 character system acronym).  This database
  538. * contains 2 fields:
  539. *              HELP_VAR     Character     10
  540. *              HELP_MSG     Memo
  541. * The database is indexed on HELP_VAR to xxxxxHLP.NTX, and stores its
  542. * memo data in file xxxxxHLP.DBT.
  543. *
  544. * Creation:
  545. *   Randy Richter, CALCULON Corporation, March 17, 1986
  546. * Revision:
  547. *   Randy Richter, 9/2/86:  THIS FILE ONLY uses SC_COLOR to set color on exit.
  548. *   Randy Richter, 9/3/86:  Changed SET FILTER to SEEK; this means that 
  549. *                           HELP_VAR must be upper case (MAKEHELP.PRG sets
  550. *                           correct case; other file creation means must also)
  551. *   Randy Richter, 1/27/87: Add test for HELP_VAR = "VAR" to allow for display
  552. *                           of current variables
  553. PARAMETERS FILENAME, LINE_NUM, VAR_NAME
  554. set key 28 to                   && TURN OFF HELP FEATURE TO AVOID W '85 BUG
  555. set function 1 to chr(23)       && DEFINE F1 AS CTRL-U
  556. sel_area = select()
  557. sel_area2 = chr(sel_area + 64)
  558. if len(sys_pgm ) = 0
  559.    hname = trim(sys_dir) + trim(sys_acronm) + "HLP"
  560. else
  561.    hname = sys_pgm + ':' + trim(sys_dir) + trim(sys_acronm) + "HLP"
  562. endif
  563. if .not. file('&hname..DBF')
  564.    return
  565. endif
  566. select 9
  567. use &hname index &hname
  568. seek upper(var_name)            && ASSUMES THAT 'HELP_VAR' IS UPPER CASE !!
  569. save screen
  570. frame = chr(201) + chr(205) + chr(187) + chr(186) + chr(188) + ;
  571.         chr(205) + chr(200) + chr(186)
  572. set color to &sys_invers
  573. @ 21,0,24,79 box frame
  574. if found()
  575.    go_on = .F.
  576.    @ 24,25 say "[PRESS <F1> TO EXIT FROM HELP]"
  577.    keyboard ""
  578.    *
  579.    * NOTE: The first branch of the following IF..ENDIF is designed for use
  580.    *       within MAKEHELP; remove for other programs...
  581.    if trim(upper(var_name)) = "VAR"
  582.       msg = substr(help_msg,1,at(space(31),help_msg)-2) + all_var
  583.       if "" = memoedit(msg,22,1,23,78,.T.)
  584.       endif
  585.    else
  586.       if "" = memoedit(help_msg,22,1,23,78,.T.)
  587.       endif
  588.    endif
  589.    done = .T.
  590. else
  591.    @ 22,1 say space(78)
  592.    @ 23,1 say space(78)
  593.    @ 23,25 say "Sorry, no help is available."
  594.    set console off
  595.    ? inkey(5)
  596.    set console on
  597. endif
  598. restore screen
  599. set color to &sc_color                       && BE SURE TO INITIALIZE VARIABLE
  600. set key 28 to HELP
  601. select &sel_area2
  602. return
  603. * EOF   HELP.PRG
  604.  
  605. * EOF MAKEHELP.PRG
  606.