home *** CD-ROM | disk | FTP | other *** search
- /*
- Program: HELPDEV.PRG
- System: GRUMPFISH LIBRARY
- Author: Greg Lief
- Copyright (c) 1988-90, Greg Lief
- Clipper 5.01 Version
- Compile instructions: clipper helpdev /n/a
-
- Procs & Fncts: HELPDEV()
- : HELPSCREEN()
- : PICKACOLOR()
- : DRAW_FTHD()
- : EDITHELP()
- : HELPHEAD()
- Creates/displays user-defined help screens
- */
-
- //───── begin preprocessor directives
-
- #include "grump.ch"
- #include "inkey.ch"
- #include "achoice.ch"
-
- //───── end preprocessor directives
-
- //───── begin global declarations
-
- static buffer // saved entry screen
- static palette := [] // color palette
- static helptext // help text
- static helpdefs_ := { 0, ; // top row of help window
- 0, ; // left column of help window
- 20, ; // bottom row of help window
- 79, ; // right column of help window
- 2, ; // box outline type (single)
- 7, ; // color for box outline (W/N)
- 112, ; // color for title (N/W)
- 112, ; // color for footer (N/W)
- 15, ; // color for help text (+W/N)
- "Help Screen", ; // default title
- " Alt-P print Esc exit", ; // default footer
- "help" } // default filename (HELP.DBF)
-
- //───── manifest constants for the contents of the HELPDEV array
- #define TopRow helpdefs_[1]
- #define LeftColumn helpdefs_[2]
- #define BottomRow helpdefs_[3]
- #define RightColumn helpdefs_[4]
- #define BoxType helpdefs_[5]
- #define BoxColor helpdefs_[6]
- #define TitleColor helpdefs_[7]
- #define FooterColor helpdefs_[8]
- #define TextColor helpdefs_[9]
- #define Title helpdefs_[10]
- #define Footer helpdefs_[11]
- #define HelpFile helpdefs_[12]
-
- //───── end global declarations
-
- function helpdev(mproc, mline, mvar)
- local hotkey := 0, wk_area := select(), oldinsert, mid, ;
- oldscore := set(_SET_SCOREBOARD, .F.), oldblock
- memvar helpcode // would be declared in the calling program if it exists
-
- /*
- usually if HELPDEV() was called from anything other than GINKEY(),
- MPROC will be a null string. We would then have to use the procedure
- name three levels deep. However, in the event that the procedure
- name passed to HELPDEV() is an internal Clipper function (beginning
- with double underscore "__"), then we must use the procedure name
- four levels deep.
- */
- if empty(mproc)
- mproc := procname(3)
- elseif left(mproc, 2) = '__'
- mproc := procname(4)
- endif
- oldblock := setkey(hotkey := lastkey(), NIL)
- GFSaveEnv(, 0) // turn off cursor
- if ! file(HelpFile + '.dbf')
- waiton('initializing help database... please wait')
- dbcreate(HelpFile + ".dbf", { {"THEPROC", "C", 10, 0} , ;
- {"VAR", "C", 10, 0} , ;
- {"TEXT", "M", 10, 0} , ;
- {"TOPROW", "N", 2, 0} , ;
- {"BOTROW", "N", 2, 0} , ;
- {"LT_COL", "N", 2, 0} , ;
- {"RT_COL", "N", 2, 0} , ;
- {"BOXCOLOR","N", 3, 0} , ;
- {"TITCOLOR","N", 3, 0} , ;
- {"TXTCOLOR","N", 3, 0} , ;
- {"BOXNO", "N", 1, 0} , ;
- {"TITLE", "C", 30, 0} , ;
- {"FTCOLOR", "N", 3, 0} , ;
- {"FOOTER", "C", 30, 0} } )
- use (HelpFile) new exclusive
- index on _field->theproc + _field->var to (HelpFile)
- waitoff()
- else
- use (HelpFile) new
- endif
- buffer := savescreen(0, 0, maxrow(), maxcol())
- if ! file(HelpFile + '.ntx') && must rebuild help index file
- if flock()
- waiton("Indexing help database")
- index on _field->theproc + _field->var to (HelpFile)
- unlock
- else
- waiton("Database is being reindexed... please wait or press Esc to abort")
- do while ! flock() .and. inkey() != K_ESC
- enddo
- endif
- waitoff()
- else
- set index to (HelpFile)
- endif
-
- //───── seek on helpcode first if such a variable is defined
- seek if(type('helpcode') == "U", padr(mproc, 10) + padr(mvar, 10), ;
- padr(helpcode, 20))
- if found()
- setcolor(Color_N2S((HelpFile)->boxcolor))
- shadowbox((HelpFile)->toprow, (HelpFile)->lt_col, (HelpFile)->botrow, ;
- (HelpFile)->rt_col, (HelpFile)->boxno)
- mid := (HelpFile)->lt_col + (int((HelpFile)->rt_col - (HelpFile)->lt_col) / 2)
- @ (HelpFile)->toprow, mid - int(len(trim((HelpFile)->title))/2) ;
- ssay trim((HelpFile)->title) color Color_N2S((HelpFile)->titcolor)
- @ (HelpFile)->botrow, mid - int(len(trim((HelpFile)->footer))/2) ;
- ssay trim((HelpFile)->footer) color Color_N2S((HelpFile)->ftcolor)
- setcolor(Color_N2S((HelpFile)->txtcolor))
- memoedit((HelpFile)->text, (HelpFile)->toprow + 1, (HelpFile)->lt_col + 1, ;
- (HelpFile)->botrow - 1, (HelpFile)->rt_col - 1, .f., 'EditHelp')
- else
- setcolor('+w/n')
- SINGLEBOX(0, 0, 20, 79)
- SCRNCENTER(0, '<< help screen >>')
- SCRNCENTER(10, 'no help text defined...')
- SCRNCENTER(12, 'Press F2 to create, any other key to go back')
- if ginkey(0) == K_F2
- restscreen(0, 0, maxrow(), maxcol(), buffer)
- oldinsert := readinsert(.T.) // toggle insert mode on, save status
- setcolor(BoxColor)
- shadowbox(TopRow, LeftColumn, BottomRow, RightColumn, BoxType)
- mid := LeftColumn + (int(RightColumn - LeftColumn) / 2)
- @ BottomRow, mid - 12 ssay ' Ctrl-W save Esc quit '
- setcursor(2)
- helptext := memoedit([], TopRow + 1, LeftColumn + 1, ;
- BottomRow - 1, RightColumn - 1, .t.)
- readinsert(oldinsert)
- setcursor(0)
- if ! empty(helptext)
- append blank
- if ! neterr()
- replace (HelpFile)->theproc with if(type('helpcode') == "U", ;
- mproc, substr(helpcode, 1, 10)), ;
- (HelpFile)->var with if(type('helpcode') == "U", ;
- mvar, substr(helpcode, 11, 10)), ;
- (HelpFile)->text with helptext
- //───── redraw bottom row of box, clearing out Save/Quit msg
- @ BottomRow, mid - 12 ssay ;
- replicate(substr(BOXFRAMES[BoxType], 6, 1), 24)
- HelpScreen("A")
- else
- Err_Msg(NETERR_MSG)
- endif
- endif
- endif
- endif
-
- //───── restore hot-key
- setkey( hotkey, oldblock )
- restscreen(0, 0, maxrow(), maxcol(), buffer)
- use
- select(wk_area)
- set(_SET_SCOREBOARD, oldscore) // in case you were keeping SCORE
- GFRestEnv()
- return NIL
-
- * end of function HelpDev()
- *--------------------------------------------------------------------
-
-
- /*
- Function: HelpScreen()
- allow user to select box coordinates, box type, title,
- and colors for this help screen
- */
- static function HelpScreen(mode) // A = adding new, E = editing existing
- local xx, yy, key, buffer2, buffer3, firstloop, redraw, palettetop
- local getlist := {}
- local mainloop := .t.
- static boxtypes := {}
- if len(boxtypes) == 0
- for xx = 1 to 5
- aadd(boxtypes, substr(BOXFRAMES[xx], 1, 8))
- next
- aadd(boxtypes, 'no border')
- endif
-
- if mode == 'E'
- TopRow := (HelpFile)->toprow
- LeftColumn := (HelpFile)->lt_col
- BottomRow := (HelpFile)->botrow
- RightColumn := (HelpFile)->rt_col
- BoxType := (HelpFile)->boxno
- BoxColor := (HelpFile)->boxcolor
- TitleColor := (HelpFile)->titcolor
- FooterColor := (HelpFile)->ftcolor
- TextColor := (HelpFile)->txtcolor
- Title := (HelpFile)->title
- Footer := (HelpFile)->footer
- endif
-
- do while mainloop
- ColorSet(C_MESSAGE)
- buffer2 := ShadowBox(maxrow()-3, 11, maxrow(), 68, 2)
- SCRNCENTER(maxrow()-2, 'use arrow keys to drag top left corner of help box')
- SCRNCENTER(maxrow()-1, 'press Enter when finished')
-
- //───── get top left coordinate for help box
- firstloop := .t.
- key := 0
- do while key != K_ENTER
- redraw := .t.
- key := inkey(0)
- if firstloop
- ByeByeBox(buffer2)
- firstloop := .f.
- endif
- dispbegin()
- do case
-
- case key == K_DOWN .and. TopRow < maxrow()-4 .and. ;
- TopRow < BottomRow - 4
- restscreen(0, 0, maxrow(), maxcol(), buffer)
- TopRow++
-
- case key == K_UP .and. TopRow > 0
- TopRow--
-
- case key == K_RIGHT .and. LeftColumn < maxcol()-9 .and. ;
- LeftColumn < RightColumn - 11
- restscreen(0, 0, maxrow(), maxcol(), buffer)
- LeftColumn++
-
- case key == K_TAB .and. LeftColumn < maxcol()-14 .and. ;
- LeftColumn < RightColumn - 16
- restscreen(0, 0, maxrow(), maxcol(), buffer)
- LeftColumn += 5
-
- case key == K_SH_TAB .and. LeftColumn > 5
- restscreen(0, 0, maxrow(), maxcol(), buffer)
- LeftColumn -= 5
-
- case key == K_LEFT .and. LeftColumn > 0
- restscreen(0, 0, maxrow(), maxcol(), buffer)
- LeftColumn--
-
- case key == K_CTRL_LEFT .and. LeftColumn > 0
- restscreen(0, 0, maxrow(), maxcol(), buffer)
- LeftColumn := 0
-
- case key == K_HOME // reposition at top left corner
- LeftColumn := TopRow := 0
-
- otherwise
- redraw := .f.
- endcase
- if redraw
- @ TopRow,LeftColumn,BottomRow,RightColumn box BOXFRAMES[BoxType] ;
- color Color_N2S(BoxColor)
- setcolor(Color_N2S(TextColor))
- memoedit(helptext, TopRow+1, LeftColumn+1, BottomRow-1, ;
- RightColumn-1, .f., .f.)
- endif
- dispend()
- enddo
-
- //───── get bottom right coordinate of help box
- ColorSet(C_MESSAGE)
- buffer2 := ShadowBox(maxrow()-3, 11, maxrow(), 68, 2)
- SCRNCENTER(maxrow() - 2, ;
- 'Use arrow keys to drag bottom right corner of help box')
- SCRNCENTER(maxrow() - 1, 'Press Enter when finished')
- firstloop := .t.
- key := 0
- do while key != K_ENTER
- redraw := .t.
- key := inkey(0)
- if firstloop
- ByeByeBox(buffer2)
- firstloop := .f.
- endif
- dispbegin()
- do case
-
- case key == K_DOWN .and. BottomRow < maxrow()
- BottomRow++
-
- case key == K_UP .and. BottomRow > 6 .and. BottomRow > TopRow + 4
- restscreen(0, 0, maxrow(), maxcol(), buffer)
- BottomRow--
-
- case key == K_RIGHT .and. RightColumn < maxcol()
- RightColumn++
-
- case key == K_LEFT .and. RightColumn > 11 .and. ;
- RightColumn > LeftColumn + 11
- restscreen(0, 0, maxrow(), maxcol(), buffer)
- RightColumn--
-
- case key == K_END // reposition at bottom right corner
- RightColumn := maxcol()
- BottomRow := maxrow()
-
- case key == K_TAB .and. RightColumn < maxcol() - 5
- RightColumn += 5
-
- case key == K_SH_TAB .and. RightColumn > 16 .and. ;
- RightColumn > LeftColumn + 16
- restscreen(0, 0, maxrow(), maxcol(), buffer)
- RightColumn -= 5
-
- case key == K_CTRL_RIGHT .and. RightColumn < maxcol()
- RightColumn := maxcol()
-
- otherwise
- redraw := .f.
- endcase
- if redraw
- @ TopRow, LeftColumn, BottomRow, RightColumn box BOXFRAMES[BoxType] ;
- color Color_N2S(BoxColor)
- setcolor(Color_N2S(TextColor))
- memoedit(helptext, TopRow + 1, LeftColumn + 1, BottomRow - 1, ;
- RightColumn - 1, .f., .f.)
- endif
- dispend()
- enddo
-
- //───── drag box around
- ColorSet(C_MESSAGE)
- buffer2 := ShadowBox(maxrow()-3, 14, maxrow(), 65, 2)
- SCRNCENTER(maxrow() - 2, 'Use arrow keys to drag box to desired location')
- SCRNCENTER(maxrow() - 1, 'Press Enter when finished')
- firstloop := .t.
- key := 0
- do while key != K_ENTER
- redraw := .t.
- key := inkey(0)
- if firstloop
- ByeByeBox(buffer2)
- buffer2 := savescreen(TopRow, LeftColumn, BottomRow, RightColumn)
- firstloop := .f.
- endif
- dispbegin()
- do case
-
- case key == K_HOME
- BottomRow -= TopRow
- RightColumn -= LeftColumn
- TopRow := LeftColumn := 0
-
- case key == K_PGUP
- BottomRow -= TopRow
- TopRow := 0
-
- case key == K_END
- TopRow += maxrow()- BottomRow
- LeftColumn += maxcol() - RightColumn
- BottomRow := maxrow()
- RightColumn := maxcol()
-
- case key == K_PGDN
- TopRow += maxrow() - BottomRow
- BottomRow := maxrow()
-
- case key == K_UP .and. TopRow > 0
- TopRow--
- BottomRow--
-
- case key == K_DOWN .and. BottomRow < maxrow()
- TopRow++
- BottomRow++
-
- case key == K_LEFT .and. LeftColumn > 0
- LeftColumn--
- RightColumn--
-
- case key == K_RIGHT .and. RightColumn < maxcol()
- LeftColumn++
- RightColumn++
-
- case key == K_CTRL_LEFT .and. LeftColumn > 0
- RightColumn -= LeftColumn
- LeftColumn := 0
-
- case key == K_CTRL_RIGHT .and. RightColumn < maxcol()
- LeftColumn += maxcol() - RightColumn
- RightColumn := maxcol()
-
- otherwise
- redraw = .f.
- endcase
- if redraw
- restscreen(0, 0, maxrow(), maxcol(), buffer)
- restscreen(TopRow, LeftColumn, BottomRow, RightColumn, buffer2)
- endif
- dispend()
- enddo
-
- //───── redraw header and footer if we are editing an existing screen
- if mode == "E"
- Draw_FtHd()
- endif
-
- //───── select box outline
- ColorSet(C_MESSAGE)
- buffer2 := ShadowBox(maxrow()-3, 18, maxrow(), 61, 2)
- SCRNCENTER(maxrow()-2, 'Use arrow keys to select help box outline')
- SCRNCENTER(maxrow()-1, 'Press Enter when finished')
- buffer3 := shadowbox(10, 35, 17, 44, 2)
- BoxType := max(achoice(11, 36, 17, 43, boxtypes, '', 'PickABox', ;
- BoxType, BoxType), 1)
- ByeByebox(buffer3)
- @ TopRow, LeftColumn, BottomRow, RightColumn ;
- box substr(BOXFRAMES[BoxType], 1, 8) color Color_N2S(BoxColor)
- Draw_FtHd()
- ByeByeBox(buffer2)
-
- //───── header and footer
- ColorSet(C_MESSAGE)
- Title := padr(Title, 30)
- Footer := padr(Footer, 30)
- buffer2 := ShadowBox(maxrow()-3, 10, maxrow(), 69, 2)
- @ 22, 12 ssay 'Enter help screen header:'
- @ 23, 12 ssay 'Enter help screen footer:'
- @ 22, 38 get Title
- @ 23, 38 get Footer
- setcursor(2)
- read
- setcursor(0)
- ByeByeBox(buffer2)
- @ TopRow, LeftColumn, BottomRow, RightColumn ;
- box substr(BOXFRAMES[BoxType], 1, 8) color Color_N2S(BoxColor)
- Draw_FtHd()
-
- //───── draw color palette based upon location of help window
- palettetop := if(TopRow > 8, 0, 14)
- if empty(palette)
- for xx = 0 to 127
- palette += " " + chr(xx) + chr(4) + chr(xx) + " " + chr(xx)
- next
- endif
- restscreen(palettetop, 16, palettetop + 7, 63, palette)
- setcolor('w/n')
- scroll(palettetop + 8, 16, palettetop + 8, 63, 0)
-
- BoxColor := PickAColor('box', BoxColor, palettetop)
- TitleColor := PickAColor('title', TitleColor, palettetop)
- FooterColor := PickAColor('footer', FooterColor, palettetop)
- TextColor := PickAColor('text', TextColor, palettetop)
-
- //───── okay, show 'em the beast and ask for confirmation
- restscreen(0, 0, maxrow(), maxcol(), buffer)
- setcolor(Color_N2S(BoxColor))
- shadowbox(TopRow, LeftColumn, BottomRow, RightColumn, BoxType)
- Draw_FtHd()
- setcolor(Color_N2S(TextColor))
- memoedit(helptext, TopRow+1, LeftColumn+1, BottomRow-1, RightColumn-1, .f., .f.)
- mainloop := ! yes_no('Is this satisfactory')
- enddo
- if rlock()
- replace (HelpFile)->toprow with TopRow, ;
- (HelpFile)->botrow with BottomRow, ;
- (HelpFile)->lt_col with LeftColumn, ;
- (HelpFile)->rt_col with RightColumn, ;
- (HelpFile)->title with Title, ;
- (HelpFile)->footer with Footer, ;
- (HelpFile)->boxcolor with BoxColor, ;
- (HelpFile)->titcolor with TitleColor, ;
- (HelpFile)->ftcolor with FooterColor, ;
- (HelpFile)->txtcolor with TextColor, ;
- (HelpFile)->boxno with BoxType
- unlock
- else
- err_msg(NETERR_MSG)
- endif
- return NIL
-
- * end function HelpScreen()
- *--------------------------------------------------------------------*
-
-
- /*
- Function: PickAColor()
- allow user to select box coordinates, box type, title,
- and colors for this help screen
- */
- static function PickAColor(msg, colortype, ntop)
- local mrow := ntop + int(colortype / 16), firstloop := .t., ;
- mcol := 17 + colortype % 16 * 3, key := 0, buffer
- ColorSet(C_MESSAGE)
- buffer := ShadowBox(maxrow()-2, 6, maxrow(), 73, 2)
- @ maxrow()-1, 8 ssay padr('Use arrow keys to change ' + msg + ' color ' + ;
- '- press Enter when finished', 64)
- do while key != K_ENTER
- @ mrow, mcol ssay chr(4) color '*' + Color_N2S(colortype)
- key := inkey(0)
- if firstloop
- ByeByeBox(buffer)
- firstloop := .f.
- endif
- do case
-
- case key == K_DOWN .and. mrow < ntop + 7
- mrow++
- colortype += 16
-
- case key == K_UP .and. mrow > ntop
- mrow--
- colortype -= 16
-
- case key == K_RIGHT .and. mcol < 62
- colortype++
- mcol += 3
-
- case key == K_LEFT .and. mcol > 17
- colortype--
- mcol -= 3
-
- endcase
- do case
-
- case msg == 'box' // adjusting the box color
- @ TopRow, LeftColumn, BottomRow, RightColumn ;
- box substr(BOXFRAMES[BoxType], 1, 8) color Color_N2S(colortype)
- Draw_FtHd()
-
- case msg == 'title' // adjusting the title color
- @ TopRow, LeftColumn + (int(RightColumn - LeftColumn) / 2) - ;
- int(len(trim(Title))/2) ssay trim(Title) color Color_N2S(colortype)
-
- case msg == 'footer' // adjusting the footer color
- @ BottomRow, LeftColumn + (int(RightColumn - LeftColumn) / 2) - ;
- int(len(trim(Footer))/2) ssay trim(Footer) color Color_N2S(colortype)
-
- case msg == 'text' // adjusting the text color
- setcolor(Color_N2S(colortype))
- memoedit(helptext, TopRow+1, LeftColumn+1, BottomRow-1, ;
- RightColumn-1, .f., .f.)
- endcase
- restscreen(ntop, 16, ntop + 7, 63, palette)
- enddo
- return colortype
-
- * end static function PickAColor()
- *--------------------------------------------------------------------*
-
-
- /*
- function: PickABox()
- */
- function PickABox(stat, curr_elem, rel_row)
- local ret_val := 2, mrow := row(), mcol := col(), key := lastkey(), buffer
- do case
- case stat == AC_IDLE // arrow key - redraw box
- dispbegin()
- buffer := savescreen(10, 35, 18, 46)
- @ TopRow, LeftColumn, BottomRow, RightColumn box ;
- substr(BOXFRAMES[curr_elem], 1, 8) color Color_N2S(BoxColor)
- Draw_FtHd()
- restscreen(10, 35, 18, 46, buffer)
- dispend()
-
- case stat == AC_EXCEPT
-
- if key == K_ESC
- ret_val := AC_ABORT
- elseif key == K_ENTER
- ret_val := AC_SELECT
- endif
-
- endcase
- setpos(mrow, mcol) // restore proper screen coordinates
- return ret_val
-
- * end function PickABox()
- *--------------------------------------------------------------------*
-
-
- /*
-
- function: Draw_FfHd() -- redraw header and footer
-
- */
- static function draw_fthd
- local mid := LeftColumn + (int(RightColumn - LeftColumn) / 2)
- @ TopRow, mid - int(len(trim(Title)) / 2) ssay trim(Title) ;
- color Color_N2S(TitleColor)
- @ BottomRow, mid - int(len(trim(Footer)) / 2) ssay trim(Footer) ;
- color Color_N2S(FooterColor)
- return nil
-
- * end static function Draw_FtHd()
- *--------------------------------------------------------------------*
-
-
- /*
-
- function: EditHelp() -- UDF for MEMOEDIT() above
-
- */
- function EditHelp(mstat, mline, mcol)
- local mtext, mproc, key := lastkey(), linewidth, lines, currline
- if key = K_ALT_E // edit existing help text
- setcursor(2)
- if rlock()
- (HelpFile)->text := helptext := ;
- memoedit((HelpFile)->text, (HelpFile)->toprow + 1, ;
- (HelpFile)->lt_col + 1, (HelpFile)->botrow - 1, ;
- (HelpFile)->rt_col - 1, .t.)
- setcursor(0)
- HelpScreen("E") // edit the rest of the screen
- unlock
- else
- err_msg(NETERR_MSG)
- endif
- elseif key = K_ALT_P // print this help screen
- if PrintOK()
- waiton('Now printing help text, press Esc to abort')
- set device to printer
- currline := 1
- linewidth := (HelpFile)->rt_col - (HelpFile)->lt_col + 1
- lines := mlcount((HelpFile)->text, linewidth)
- HelpHead()
- do while currline <= lines .and. inkey() != K_ESC
- @ prow()+1, (HelpFile)->lt_col say ;
- trim(memoline((HelpFile)->text, linewidth, currline++))
- if prow() >= 59
- HelpHead()
- endif
- enddo
- eject
- set device to screen
- waitoff()
- endif
- endif
- return 0
-
- * end function EditHelp()
- *--------------------------------------------------------------------*
-
-
- /*
- function: HelpHead() -- heading when printing help text
- */
- static function HelpHead
- static page := 1
- devpos(0, 0)
- @ 1, 1 say upper((HelpFile)->title)
- @ 1,72 say 'Page ' + ltrim(str(page++)) // increment page counter
- devpos(3, 0)
- return NIL
-
- * end static function HelpHead()
- *--------------------------------------------------------------------*
-
-
- /*
- Function: HelpDevSet()
- Purpose: Allows developer to change any of the help defaults
- Notes: See manifest constants contained in GRUMPH.CH
- Returns: Previous setting
- Examples:
-
- #include "grumph.ch"
-
- helpdevset(_HELP_FILENAME, "custhelp") // use CUSTHELP.DBF, not HELP.DBF
- helpdevset(_HELP_TOP, 10) // use 10 as top row for window
- */
- function HelpdevSet(nsetting, value)
- local ret_val := helpdefs_[nsetting]
- helpdefs_[nsetting] := value
- return ret_val
-
- * end function HelpDevSet()
- *--------------------------------------------------------------------*
-
- * eof helpdev.prg
-