home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / xbase / library / dbase / duflp / screen.prg < prev    next >
Text File  |  1992-07-06  |  52KB  |  1,283 lines

  1. *-------------------------------------------------------------------------------
  2. *-- Program...: SCREEN.PRG
  3. *-- Programmer: Ken Mayer (KENMAYER)
  4. *-- Date......: 06/29/1992
  5. *-- Notes.....: A few routines not left in PROC.PRG, these are not used as much
  6. *--             by my own systems. See the file: README.TXT for details on how
  7. *--             to use this library file.
  8. *-------------------------------------------------------------------------------
  9.  
  10. FUNCTION Radio
  11. *-------------------------------------------------------------------------------
  12. *-- Programmer..: Ed Lafferty (GICHIN)
  13. *-- Date........: 06/08/1992
  14. *-- Notes.......: Routine to create and size a popup with radio buttons
  15. *--               for choosing only one of up to four options.  Pressing
  16. *--               the <Space Bar> on an option turns it on or off.
  17. *--               Pressing <Enter> chooses the selected option and leaves
  18. *--               the routine.
  19. *-- Written for.: dBase IV, 1.1
  20. *-- Rev. History: 02/25/1992 - original procedure.
  21. *--               02/27/1992 -- Ken Mayer -- added option for color, but had
  22. *--               to take number of choices back to 4 to do so. Minor 
  23. *--               alterations performed to add color choice ... and cleaning
  24. *--               up after self ... (original cleared the screen first ...
  25. *--               this version saves screen, restores back to it ...) Oh yeah,
  26. *--               I turned it into a function, rather than a procedure, as well.
  27. *--               06/08/1992 -- Ken Mayer -- explicit color handling.
  28. *-- Calls.......: CENTER                Procedure in PROC.PRG
  29. *--               SHADOW                Procedure in PROC.PRG
  30. *--               EXTRCLR()             Function in PROC.PRG
  31. *--               COLORBRK()            Function in PROC.PRG
  32. *--               RECOLOR               Procedure in PROC.PRG
  33. *-- Called by...: Any
  34. *-- Usage.......: Radio(<nULRow>,<nULCol>,<nChoice>,"<cTxt1>","<cTxt2>",;
  35. *--                        "<cTxt3>","<cTxt4>","<cTitle>","<cColor>")
  36. *-- Example.....: cPort = Radio(8,15,1,"LPT1","LPT2","LPT3","",;
  37. *--                             "Choose a printer port","rg+/gb,n/w,rg+/gb")
  38. *-- Returns.....: number of chosen button in nChoice
  39. *-- Parameters..: nUlrow  = upper left row of popup
  40. *--               nUlcol  = upper left column of popup
  41. *--               nChoice = default chosen button
  42. *--               cTxt1   = Text for 1st button
  43. *--               cTxt2   =  "    "  2nd   "
  44. *--               cTxt3   =  "    "  3rd   "
  45. *--               cTxt4   =  "    "  4th   "
  46. *--               cTitle  = Text for the box title
  47. *--               cColor  = Color string (i.e., "RG+/GB,N/W,RG+/GB")
  48. *-------------------------------------------------------------------------------
  49.  
  50.     parameters nUlrow, nUlcol, nChoice, cTxt1, cTxt2, cTxt3, cTxt4, ;
  51.                     cTitle, cColor
  52.     private nHeight, nKey, nCnt, nWidth, cStr, cTxt0, cMidCol, cFirstCol,;
  53.                    cCursor,cCurColor,cTempCol
  54.     
  55.     cCursor = set("CURSOR")
  56.     store cTitle to cTxt0
  57.     save screen to sRadio
  58.     store 0 to nHeight, nKey, nCnt, nWidth
  59.     store nChoice to nOrig  && in case user presses <Esc> to exit ...
  60.     
  61.     *-- save current colors
  62.     cCurColor = set("ATTRIBUTES")
  63.     *-- set new ones
  64.     cTempCol = colorbrk(cColor,1)
  65.     set color of normal  to &cTempCol
  66.     set color of message to &cTempCol
  67.     cTempCol = colorbrk(cColor,2)
  68.     set color of highlight to &cTempCol
  69.     cTempCol = colorbrk(cColor,3)
  70.     set color of box to &cTempCol
  71.     
  72.     *-- deal with these colors in displaying some stuff ...
  73.     cMidCol = colorbrk(cColor,2)
  74.     *-- First color (for message) is easier ...
  75.     cFirstCol = colorbrk(cColor,1)
  76.     
  77.     *-- Determine height and width of popup
  78.     do case
  79.         case len(cTxt4) > 0
  80.            nHeight = 4
  81.         case len(cTxt3) > 0
  82.            nHeight = 3
  83.         case len(cTxt2) > 0
  84.            nHeight = 2
  85.         otherwise
  86.            nHeight = 1
  87.     endcase
  88.     
  89.     do while nCnt <=nHeight
  90.        store "cTxt"+str(nCnt,1) to cStr
  91.        if len(&cstr) > nWidth
  92.           nWidth = len(&cStr)
  93.        endif
  94.        nCnt = nCnt + 1
  95.     enddo
  96.     
  97.     *-- create popup
  98.     define window wRadio from nUlRow,nUlCol to nUlRow+nHeight+3,nUlCol+nWidth+9;
  99.             double color &cColor
  100.     do center with 23,80,"&cFirstCol","Press "+chr(24)+chr(25)+;
  101.                                     ", <Space> to select/de-select, <Enter> to quit"
  102.     do shadow with nULRow, nULCol, nULRow+nHeight+3, nULCol+nWidth+9
  103.     activate window wRadio
  104.     
  105.     *-- display screen
  106.     store 1 to nCnt
  107.     do center with 0, nWidth+8, "", cTitle
  108.     do while nCnt <= nHeight
  109.        store "cTxt"+str(nCnt,1) to cStr
  110.        @ nCnt+1, 2 SAY "[ ]" color &cMidCol
  111.         @ nCnt+1, 6 say &cStr
  112.        nCnt = nCnt + 1
  113.     enddo
  114.     
  115.     *-- prepare for and get nChoice
  116.     if nChoice > 0
  117.        store nChoice to nCnt
  118.         @nCnt+1,3 say "■" color &cMidCol
  119.     else
  120.        store 1 to nCnt
  121.     endif
  122.     store .F. to ldone
  123.     
  124.     *-- this loop processes user input ... 
  125.     do while .not. ldone
  126.         @ nCnt+1,3 say "" color &cMidCol
  127.         nkey = inkey(0)
  128.         do case
  129.         case nkey = 27                   && Press Esc to exit
  130.            store nOrig to nChoice        && Leave at "default"
  131.            store .T. to ldone
  132.         case nkey = 13
  133.            store .T. to ldone
  134.         case nkey = 32                   && Press Enter or Space
  135.               set cursor off
  136.               if nChoice = nCnt
  137.                  @ nCnt+1,3 say " " color &cMidCol
  138.                  store 0 to nChoice
  139.               else
  140.                  @ nChoice+1,3 say " " color &cMidCol
  141.                  @ nCnt+1,3 say "■" color &cMidCol
  142.                  store nCnt to nChoice
  143.               endif
  144.               set cursor on
  145.         case nkey = 5                    && Press up arrow
  146.            if nCnt > 1
  147.               nCnt = nCnt - 1
  148.            else
  149.               nCnt = nHeight
  150.            endif
  151.         case nkey = 24                   && Press down arrow
  152.            if nCnt < nHeight
  153.               nCnt = nCnt + 1
  154.            else
  155.               nCnt = 1
  156.            endif
  157.         endcase
  158.     enddo
  159.     
  160.     *-- cleanup
  161.     deact window wRadio
  162.     release window wRadio
  163.     restore screen from sRadio
  164.     release screen sRadio
  165.     set message to
  166.     set cursor &cCursor
  167.     do ReColor with cCurColor
  168.     
  169. RETURN nChoice
  170. *-- EoF: Radio()
  171.  
  172. PROCEDURE CheckBox
  173. *-------------------------------------------------------------------------------
  174. *-- Programmer..: Ed Lafferty (GICHIN)
  175. *-- Date........: 02/28/1992
  176. *-- Notes.......: Routine to create and size a popup with check boxes
  177. *--               for choosing any of a number (up to five) options.  Pressing
  178. *--               the <Space Bar> on an option turns it on or off.
  179. *--               Pressing <Enter> chooses the selected option and leaves
  180. *--               the routine. You must use a data structure with logical
  181. *--               fields, or memvars that are logical for this. Either way,
  182. *--               even if you don't use five logical fields/memvars, you must
  183. *--               pass a field/memvar to the procedure -- see Example below 
  184. *--               (the logicals -- lCHK1, lCHK2, etc.-- must be fields or
  185. *--               memvars due to a limitation in parameter passing in dBASE IV.)
  186. *-- Written for.: dBase IV, Version 1.1
  187. *-- Rev. History: 02/25/1992 - original procedure.
  188. *--               02/28/1992 -- Ken Mayer -- modified to allow passing cColor,
  189. *--               and a little cleanup of code and such. Minor changes.
  190. *-- Calls.......: CENTER               Procedure in PROC.PRG
  191. *--               SHADOW               Procedure in PROC.PRG
  192. *--               EXTRCLR()            Function in PROC.PRG
  193. *--               COLORBRK()           Function in PROC.PRG
  194. *--               RECOLOR              Procedure in PROC.PRG
  195. *-- Called by...: Any
  196. *-- Usage.......: do checkbox with <nULCol>,<nULRow>,<lchk1>,<lchk2>,<lchk3>,;
  197. *--                          <lchk4>,"<cTxt1>","<cTxt2>","<cTxt2>",;
  198. *--                          "<cTxt3>","<cTxt4>","<cTxt0>","<cColor>"
  199. *-- Example.....: do Checkbox with 8, 15, lchk1, lchk2, lchk3, lchk4,;
  200. *--                    "LPT1", "LPT2", "LPT3","","Choose a printer port",;
  201. *--                    "rg+/gb,w+/n,rg+/gb"
  202. *-- Returns.....: .T. for selected items, .F. for non-selected items --
  203. *--               this routine changes the value of the logical fields passed
  204. *--               to it.
  205. *-- Parameters..: nULRow = upper left row of popup
  206. *--               nULCol = upper left column of popup
  207. *--               lChkn  = default value of box 'n' -- MUST BE FIELDS/MEMVARS
  208. *--               cTxt1  = Text for 1st box
  209. *--               cTxt2  =  "    "  2nd   "
  210. *--               cTxt3  =  "    "  3rd   "
  211. *--               cTxt4  =  "    "  4th   "
  212. *--               cTxt0  = Text for the box title
  213. *--               cColor = Colors to be used in window ...
  214. *-------------------------------------------------------------------------------
  215.  
  216.     parameters nUlrow, nUlcol, lChk1, lChk2, lChk3, lChk4, ;
  217.                  cTxt1, cTxt2, cTxt3, cTxt4, cTxt0, cColor
  218.     private nHeight, nKey, nCnt, nWidth, lOrig1, lOrig2, lOrig3, lOrig4,;
  219.               cMidCol, cFirstCol, cCursor, cCurColor,cTempCol
  220.     
  221.     *-- save current colors
  222.     cCurColor = set("ATTRIBUTES")
  223.     *-- set new ones
  224.     cTempCol = colorbrk(cColor,1)
  225.     set color of normal  to &cTempCol
  226.     set color of message to &cTempCol
  227.     cTempCol = colorbrk(cColor,2)
  228.     set color of highlight to &cTempCol
  229.     cTempCol = colorbrk(cColor,3)
  230.     set color of box to &cTempCol
  231.     
  232.     *-- setup ...
  233.     cCursor = set("CURSOR")
  234.     save screen to sCheck
  235.     store 0 to nHeight, nKey, nCnt, nWidth
  236.     *-- save original settings, in case <Esc> gets pressed below ...
  237.     store lChk1 to lOrig1
  238.     store lChk2 to lOrig2
  239.     store lChk3 to lOrig3
  240.     store lChk4 to lOrig4
  241.     *-- deal with some colors ...
  242.     cMidCol = colorbrk(cColor,2)
  243.     cFirstCol = colorbrk(cColor,1)
  244.     
  245.     *-- Determine height and width of popup
  246.     *-- Determine height
  247.     do case
  248.     case len(cTxt4) > 0
  249.        nHeight = 4
  250.     case len(cTxt3) > 0
  251.        nHeight = 3
  252.     case len(cTxt2) > 0
  253.        nHeight = 2
  254.     case len(cTxt1) > 0
  255.        nHeight = 1
  256.     endcase
  257.     
  258.     *-- Determine width
  259.     do while nCnt <=nHeight
  260.        store "cTxt"+str(nCnt,1) to cStr
  261.        if len(&cstr) > nWidth
  262.           nWidth = len(&cStr)
  263.        endif
  264.        nCnt = nCnt + 1
  265.     enddo
  266.     
  267.     *-- create popup
  268.     define window wCheck from nUlrow, nUlcol to nUlrow+nHeight+3, nUlcol+nWidth+8;
  269.         double color &cColor
  270.     do center with 23,80,"&cFirstCol","Press "+chr(24)+chr(25)+;
  271.         ", <Space> to select/de-select, <Enter> to quit"
  272.     do shadow with nULRow,nULCol,nULRow+nHeight+3,nULCol+nWidth+8
  273.     activate window wCheck
  274.     store 1 to nCnt
  275.     do center with 0, nWidth+8, "", cTxt0
  276.     
  277.     *-- paint screen
  278.     do while nCnt <= nHeight
  279.        store "cTxt"+str(nCnt,1) to cStr
  280.        store "lChk"+str(nCnt,1) to cChk
  281.        @ nCnt+1, 2 SAY "[ ]" color &cMidCol
  282.         @ nCnt+1, 6 say &cStr
  283.        @ nCnt+1, 3 SAY IIF(&cChk,"X"," ") color &cMidCol
  284.        nCnt = nCnt + 1
  285.     enddo
  286.         
  287.     *-- prepare for and get nChoice
  288.     store 1 to nCnt
  289.     store .F. to ldone
  290.     do while .not. ldone
  291.         store "lChk"+str(nCnt,1) to cChk
  292.         @ nCnt+1,3 say "" color &cMidCol
  293.         nkey = inkey(0)
  294.         do case
  295.             case nkey = 27                   && Press Esc to exit
  296.                store lorig1 to lChk1         && Therefore, restore original
  297.                store lOrig2 to lChk2         && values to lChk<n>'s
  298.                store lOrig3 to lChk3
  299.                store lOrig4 to lChk4
  300.                store .T. to ldone
  301.             case nkey = 13                   && Press Enter when finished
  302.                store .T. to ldone
  303.             case nkey = 32                   && Press Space
  304.                   set cursor off
  305.                   if &cChk                          && Box was already selected,
  306.                      @ nCnt+1,3 say " " color &cMidCol   && so now de-select it
  307.                      store .F. to &cChk
  308.                   else                              && Box was not already selected,
  309.                      @ nCnt+1,3 say "X" color &cMidCol   && so now select it
  310.                      store .T. to &cChk
  311.                   endif
  312.                   set cursor on
  313.             case nkey = 5                    && Press up arrow
  314.                if nCnt > 1
  315.                   nCnt = nCnt - 1
  316.                else
  317.                   nCnt = nHeight
  318.                endif
  319.             case nkey = 24                   && Press down arrow
  320.                if nCnt < nHeight
  321.                   nCnt = nCnt + 1
  322.                else
  323.                   nCnt = 1
  324.                endif
  325.         endcase
  326.     enddo
  327.     
  328.     *-- Cleanup
  329.     release window wCheck
  330.     restore screen from sCheck
  331.     release screen sCheck
  332.     set message to
  333.     set cursor &cCursor
  334.     do ReColor with cCurColor
  335.     
  336. RETURN
  337. *-- EoP: ChkBox
  338.  
  339. FUNCTION MenuPad
  340. *-------------------------------------------------------------------------------
  341. *-- Programmer..: Douglas P. Saine (XRED)
  342. *-- Date........: 02/11/1992
  343. *-- Notes.......: Used to create menu prompts of an even length. It works
  344. *--               on any prompt - menu pads or popups.
  345. *-- Written for.: dBASE IV, 1.1
  346. *-- Rev. History: 02/07/1992 - original function.
  347. *--               02/11/1992 -- Ken Mayer -- modified to truncate <cChoice>
  348. *--                 if it's longer than <nLength>.
  349. *-- Calls.......: ALLTRIM()            Function in PROC.PRG
  350. *-- Called by...: Any
  351. *-- Usage.......: MenuPad("<cChoice>",<nLength>)
  352. *-- Example.....: Define pad pPad1 of mMain;
  353. *--                      prompt MenuPad("Menu Choice1",25) at 2,5
  354. *-- Returns.....: <cChoice> padded with spaces (or truncated, if necessary)
  355. *--               to <nLength>.
  356. *-- Parameters..: cChoice = Menu-Pad/Popup-Bar Prompt description
  357. *--               nLength = Length of pad/bar ...
  358. *-------------------------------------------------------------------------------
  359.  
  360.     parameters cChoice, nLength
  361.     private cReturn
  362.     
  363.     if len(alltrim(cChoice)) > nLength  && is it too long?
  364.         cReturn = left(cChoice,nLength)  && truncate it ...
  365.     else             && otherwise, pad it with spaces to the length required
  366.         cReturn = cChoice + space(nLength-len(alltrim(cChoice)))
  367.     endif
  368.  
  369. RETURN cReturn
  370. *-- EoF: MenuPad()
  371.  
  372. FUNCTION Banner
  373. *-------------------------------------------------------------------------------
  374. *-- Programmer..: Dan Madoni (Borland)
  375. *-- Date........: 09/xx/1991
  376. *-- Notes.......: This will display a left-scrolling message on the screen
  377. *--               within the boundaries specified in the UDF by the user.
  378. *--               It will wait for a keypress and then go away. Taken from
  379. *--               TECHNOTES.
  380. *-- Written for.: dBASE IV, 1.1
  381. *-- Rev. History: None
  382. *-- Usage.......: Banner(<nRow>,<nCol>,<nWidth>,"<cMessage>","<cColor>")
  383. *-- Example.....: ?? Banner(5,30,20,"Love your tie, is it new?","w+/r")
  384. *-- Returns.....: Null ("")
  385. *-- Parameters..: nRow     = Leftmost ROW position of scrolled message
  386. *--               nCol     = Leftmost COL position of scrolled message
  387. *--               nWidth   = Length of displayable area starting at nRow,nCol
  388. *--               cMessage = Message to be scrolled
  389. *--               cColor   = Color of scrolling message
  390. *-------------------------------------------------------------------------------
  391.  
  392.     parameters nRow,nCol,nWidth,cMessage,cColor
  393.     private cCursor,cTalk,cMsg,nCounter,cPause
  394.     
  395.     *-- save some environment essentials
  396.     save screen to sBanner
  397.     cCursor = set("CURSOR")
  398.     cTalk   = set("TALK")
  399.     set cursor off
  400.     set talk off
  401.     
  402.     *-- deal with message
  403.     cMsg = space(nWidth)+cMessage+" "
  404.     nCounter = 0
  405.     
  406.     *-- loop
  407.     do while .t.
  408.         nCounter = nCounter + 1
  409.         if nCounter > len(cMsg)
  410.             nCounter = 1
  411.         endif
  412.         
  413.         *-- user hits any key
  414.         cPause = inkey(.15)
  415.         if cPause # 0
  416.             exit
  417.         endif
  418.         
  419.         *-- display message within scrollable area
  420.         @nRow,nCol say substr(cMsg,nCounter,nWidth) color &cColor
  421.     enddo
  422.     
  423.     *-- restore environment
  424.     restore screen from sBanner
  425.     release screen sBanner
  426.     set cursor &cCursor
  427.     set talk &cTalk
  428.  
  429. RETURN ""
  430. *-- EoF: Banner()
  431.  
  432. FUNCTION SeeMatch
  433. *-------------------------------------------------------------------------------
  434. *-- Programmer..: Dan Madoni (Borland)
  435. *-- Date........: 09/xx/1991
  436. *-- Notes.......: Can be included in format screen to display an instant
  437. *--               lookup match on a particular field. A shadowed box will
  438. *--               appear with the matching value ... Taken from TECHNOTES.
  439. *-- Written for.: dBASE IV, 1.1
  440. *-- Rev. History: 06/12/1992 -- Minor -- added call to RECOLOR
  441. *-- Calls.......: RECOLOR              Procedure in PROC.PRG
  442. *-- Called by...: None
  443. *-- Usage.......: SeeMatch("<cFile>",<cSeekExp>,"<cReturn>",<nULRow>,<nULCol>,;
  444. *--                        <nBRRow>,<nBRCol>,"<cColor>)
  445. *-- Example.....: SeeMatch("TRAVEL",LASTNAME,"TRAVELCODE",2,40,4,60,"w+/r")
  446. *-- Returns.....: .t.
  447. *-- Parameters..: cFile    = Database alias in which lookup will be performed.
  448. *--                          -- this file must already be USEd in some area.
  449. *--               cSeekExp = Expression which will be SEEKed.
  450. *--               cReturn  = Name of field to contain the 'return' value.
  451. *--               nULRow   = Upper Left Row for box
  452. *--               nULCol   = Upper Left Column for box
  453. *--               nBRRow   = Bottom Right Row
  454. *--               nBRCol   = Bottom Right Column
  455. *--               cColor   = Color of box
  456. *-------------------------------------------------------------------------------
  457.     
  458.     parameters cFile,cSeeExp,cReturn,nULRow,nULCol,nBRRow,nBRCol,cColor
  459.     private cRetVal, cAttr, cStartFile
  460.     
  461.     *-- store starting position ...
  462.     cStartFile = alias()
  463.     select &cFile
  464.     
  465.     *-- look for a matching expression
  466.     seek cSeekExp
  467.     if found()
  468.         cRetVal = &cReturn
  469.     else
  470.         cRetVal = "<Not Found>"
  471.     endif
  472.     
  473.     *-- Store current color and draw a box
  474.     cAttr = set("ATTRIBUTES")
  475.     @nULRow+1,nULCol+1 fill to nBRRow+1,nBRCol+1 color w/n  && shadow
  476.     set color to &cColor
  477.     @nULRow,nULCol clear to nBRRow,nBRCol  && clear out area text will go in
  478.     @nULRow,nULCol To       nBRRow,nBRCol  && draw box
  479.     
  480.     *-- display matching expresion, and return to initial area ...
  481.     @nULRow+1,nULCol+2 say cRetVal
  482.     do ReColor with cAttr
  483.     select cStartFile
  484.     
  485. RETURN .t.
  486. *-- EoF: SeeMatch()
  487.  
  488. FUNCTION Dialog
  489. *-------------------------------------------------------------------------------
  490. *-- Programmer..: Larry Quaglia (Borland)
  491. *-- Date........: 11/xx/1991
  492. *-- Notes.......: This routine provides a 'standard' set of dialogue boxes
  493. *--               and buttons for all applications. The concept is to provide
  494. *--               standardization for your apps. Taken from TECHNOTES.
  495. *-- Written for.: dBASE IV, 1.1
  496. *-- Rev. History: 11/xx/1991 -- first published in TechNotes.
  497. *--               06/09/1992 -- Modified to handle explicit colors, changed
  498. *--               the color parameters a tad ... (KENMAYER)
  499. *-- Calls.......: SHADOW               Function in PROC.PRG
  500. *--               RECOLOR              Procedure in PROC.PRG
  501. *-- Called by...: Any
  502. *-- Usage.......: Dialog("<cMsg>",<nType>,"<cBorder>",<nDefBut>,<lShadow>,;
  503. *--                      "<cWind>","<cButton>")
  504. *-- Example.....: Dialog("We have completed the transaction.",0,"DOUBLE",;
  505. *--                      0,.t.,"RG+/GB","W+/N")
  506. *-- Returns.....: Character -- Either 'ERROR' or title of Button.
  507. *-- Parameters..: cMsg    = Message to be displayed -- maximum of 78 characters
  508. *--                          (one line only)
  509. *--               nType   = Dialogue box TYPE. Options are 0 to 5:
  510. *--                         0:   'OK'
  511. *--                         1: 'OK'  'CANCEL'
  512. *--                         2: 'ABORT'  'RETRY'  'IGNORE'
  513. *--                         3: 'YES'  'NO'  'CANCEL'
  514. *--                         4: 'YES'  'NO'
  515. *--                         5: 'RETRY' 'CANCEL'
  516. *--               cBorder = Border Style -- options are: "" (null) for SINGLE
  517. *--                         DOUBLE or PANEL.
  518. *--               nDefBut = Default Button. 
  519. *--               lShadow = Display with a shadow or not (both on window and
  520. *--                         buttons)?
  521. *--               cWind   = Window Colors (must be valid dBASE color combo:
  522. *--                          i.e., "RG+/GB")
  523. *--               cButton = Highlighted Button Color (Same as above, should 
  524. *--                         contrast ...)
  525. *-------------------------------------------------------------------------------
  526.  
  527.     parameters cMsg,nType,cBorder,nDefBut,lShadow,cWind,cButton
  528.     private nMsgLen,cNewColor,aButton,nMaxLine,nY,nBoxLen,nNumButton,nCounter,;
  529.             nBasex,nYCol,nMsgLoc,cCurColor
  530.  
  531.     save screen to sDialog              && so we can restore at end of routine
  532.     
  533.     *-- determine length of message
  534.     nMsgLen = len(trim(ltrim(cMsg))) + 1
  535.     
  536.     *-- Check for valid parms
  537.     do case
  538.         case nMsgLen > 78
  539.             RETURN "ERROR - Message Length"
  540.         case .not. (upper(cBorder) = "DOUBLE" .or. upper(cBorder) = "PANEL" .or.;
  541.                     len(trim(cBorder)) = 0)
  542.             RETURN "ERROR - Border"
  543.     endcase
  544.     
  545.     *-- save current color info and set color to user-defined
  546.     cCurColor = set("ATTRIBUTES")
  547.     set color of normal    to &cWind
  548.     set color of box       to &cWind
  549.     set color of message   to &cWind
  550.     set color of highlight to &cButton
  551.     
  552.     *-- Allow use of <Tab> to move from button to button
  553.     on key label tab keyboard chr(4)  && act as if right arrow were pushed
  554.     
  555.     *-- Define button array -- max of 3 buttons (at the moment)
  556.     declare aButton[3]
  557.     aButton[1] = ""
  558.     aButton[2] = ""
  559.     aButton[3] = ""
  560.     
  561.     *-- Establish screen height to properly center dialogue box
  562.     nMaxLine = iif(right(set("DISP"),2) = "43",43,24)
  563.     
  564.     *-- Determine length of passed "message" parameter. If long enough, make
  565.     *-- the dialog box a little bigger. If very short, make it just big
  566.     *-- enough to accomodate the three buttons.
  567.     nY = iif(int(nMsgLen) > 30,int(nMsgLen/2)+2,24)
  568.     nBoxLen = 2 * nY
  569.     
  570.     *-- Setup the window and determine if shadow ... if yes, call shadow
  571.     define window wDialog from int(nMaxLine/2)-5,40-nY to ;
  572.         int(nMaxLine/2)+4,40+nY &cBorder 
  573.     if lShadow
  574.         do shadow with int(nMaxLine/2)-5,40-nY,int(nMaxLine/2)+4,40+nY
  575.     endif
  576.     activate window wDialog
  577.     clear
  578.     
  579.     *-- Determine the type of buttons and set appropriate parms.
  580.     *-- These could be modified to your own needs.
  581.     do case
  582.         case nType = 0
  583.             nNumButton = 1
  584.             aButton[1] = "   OK   "
  585.         case nType = 1
  586.             nNumButton = 2
  587.             aButton[1] = "   OK   "
  588.             aButton[2] = " CANCEL "
  589.         case nType = 2
  590.             nNumButton = 3
  591.             aButton[1] = " ABORT  "
  592.             aButton[2] = " RETRY  "
  593.             aButton[3] = " IGNORE "
  594.         case nType = 3
  595.             nNumButton = 3
  596.             aButton[1] = "   YES  "
  597.             aButton[2] = "   NO   "
  598.             aButton[3] = " CANCEL "
  599.         case nType = 4
  600.             nNumButton = 2
  601.             aButton[1] = "   YES  "
  602.             aButton[2] = "   NO   "
  603.         case nType = 5
  604.             nNumButton = 2
  605.             aButton[1] = " RETRY  "
  606.             aButton[2] = " CANCEL "
  607.     endcase
  608.     
  609.     *-- Get dialog box length to create a bar menu of appropriate size.
  610.     *-- Define the bar menu in a loop. Deactivate it upon selection of
  611.     *-- one of the buttons.
  612.     nCounter = 1
  613.     nBaseX = nBoxLen / (nNumButton + 1)
  614.     define menu mDialog
  615.     do while nCounter <= nNumButton
  616.         pPadName = "PAD"+str(nCounter,1)  && pad name is 'PAD #'
  617.         nYCol = (nCounter * nBaseX) - (int(len(aButton[nCounter]) /2))
  618.         define pad &pPadName of mDialog prompt aButton[nCounter] at 4,nYCol
  619.         
  620.         *-- If shadow is on, put shadows on buttons as well ...
  621.         if lShadow
  622.             do shadow with 3,nYCol-2,5,nYCol+(len(aButton[nCounter]))-1
  623.         endif
  624.         @3,nYCol-1 to 5,nYCol+(len(aButton[nCounter]))  && box around button
  625.         on selection pad &pPadName of mDialog deactivate menu
  626.         nCounter = nCounter + 1
  627.     enddo
  628.     
  629.     *-- place message (centered in box)
  630.     nMsgLoc = int(nBoxLen/2) - int(nMsgLen/2)
  631.     @1,nMsgLoc say cMsg
  632.     
  633.     *-- place cursor to the default button specified by the user
  634.     nCounter = 1
  635.     do while nCounter < nDefBut
  636.         keyboard chr(4)
  637.         nCounter = nCounter + 1
  638.     enddo
  639.     
  640.     *-- Activate the whole thing, and return the button name
  641.     activate menu mDialog
  642.     cValue = trim(ltrim(prompt()))
  643.     
  644.     *-- deactivate it all, restore screen, etc.
  645.     deactivate window wDialog
  646.     release window wDialog
  647.     release menu mDialog
  648.     restore screen from sDialog
  649.     release screen sDialog
  650.     do ReColor with cCurColor
  651.     on key label tab
  652.     
  653. RETURN cValue
  654. *-- EoF: Dialog()
  655.  
  656. FUNCTION MsgExp
  657. *-------------------------------------------------------------------------------
  658. *-- Programmer..: Adam Menkes (Borland)
  659. *-- Date........: 09/xx/1991
  660. *-- Notes.......: Allows you to display message (or error message), centered
  661. *--               like SET MESSAGE ... with added utility. Does not use
  662. *--               "(Press Space)", which can be annoying. The message and the
  663. *--               line on which it is displayed will be the same color.
  664. *--               Taken from TECHNOTES.
  665. *-- Written for.: dBASE IV, 1.1
  666. *-- Rev. History: None
  667. *-- Usage.......: MsgExp("<cExp>")
  668. *-- Example.....: MsgExp("This is a message")
  669. *-- Returns.....: Message displayed (centered) on screen
  670. *-- Parameters..: cExp  = Message to be displayed
  671. *-------------------------------------------------------------------------------
  672.  
  673.     parameters cMsg
  674.     private nLen
  675.     
  676.     nLen = len(trim(cMsg))
  677.  
  678. RETURN space((80-nLen)/2) + trim(cMsg) + space((80-nLen)/2)+" "
  679. *-- EoF: MsgExp
  680.  
  681. FUNCTION Pick2
  682. *-------------------------------------------------------------------------------
  683. *-- Programmer..: Malcolm C. Rubel
  684. *-- Date........: 05/18/1992
  685. *-- Notes.......: I stole ... er ... lifted ... this from Data Based Advisor 
  686. *--               (Nov. 1991), and dUFLPed it, as well as removing the FoxPro 
  687. *--               code ...
  688. *--               It's purpose is to create a popup/picklist that will
  689. *--               find the proper location (used with a GET) on the
  690. *--               screen for itself, display the popup and return the 
  691. *--               appropriate value ...
  692. *-- Written for.: dBASE IV, 1.1
  693. *-- Rev. History: 11/xx/1991 -- Malcom C. Rubel -- Original Code
  694. *--               05/15/1992 -- Ken Mayer -- several things. First, I dUFLPed
  695. *--               the code, and documented it heavier than the original.
  696. *--                Next, I had to write a function (USED()), as there wasn't
  697. *--               one sitting around that I could see. 
  698. *--                I added the 'cTag' parameter, as well as a few minor changes
  699. *--               to the other functions that come with this routine ... 
  700. *--               05/19/1992 -- Resolved a few minor problems, removed routine
  701. *--               PK_SHOW as being unnecessary (used @nGetRow... GET to 
  702. *--               redisplay field/memvar). Added IsBlank() (copy of EMPTY()) to
  703. *--               handle different field types (original only wanted characters).
  704. *-- Calls.......: ScrRow()             Function in SCREEN.PRG
  705. *--               ScrCol()             Function in SCREEN.PRG
  706. *--               Used()               Function in FILES.PRG (and here)
  707. *-- Usage.......: Pick2("<cLookFile>","<cTag>","<cSrchFld>","<cRetFld>",;
  708. *--                     <nScrRow>,<nScrCol>)
  709. *-- Example.....: @10,20 get author ;
  710. *--                      valid required pick2("Library","Author",;
  711. *--                      "Last","Last",10,20)
  712. *-- Returns.....: lReturn (found/replaced a value or not ...)
  713. *-- Parameters..: cLookFile = file to lookup in
  714. *--               cTag      = MDX Tag to use (if blank, will use the first
  715. *--                           tag in the MDX file, via the TAG(1) option ...)
  716. *--               cSrchFld  = field(s) to browse -- if blank, function will
  717. *--                           try to use a field of same name as what 
  718. *--                           cursor is on.
  719. *--               cRetFld   = name of field value is to be returned from.
  720. *--               nScrRow   = screen-row (of GET) -- if blank, function will
  721. *--                           determine (use ,, to blank it ... or 0)
  722. *--               nScrCol   = screen-col (of GET) -- if blank, function will
  723. *--                           determine
  724. *-------------------------------------------------------------------------------
  725.  
  726.     parameters cLookFile, cTag, cSrchFld, cRetFld, nScrRow, nScrCol
  727.     private cLookFile,cSrchFld,cRetFld,nScrRow,nScrCol,cVarName,xValReturn,;
  728.             lWasOpen,cCurrBuff,lExact,lReturn,lIsFound,;
  729.             cBarFields,nWinWidth,nGetRow,nGetCol
  730.     
  731.     lReturn = .t.                       && return value must be a logical ...
  732.                                         &&   assume the best ...
  733.     cVarName = varread()                && name of the variable at GET
  734.     xVarValue = &cVarName               && value of the variable at GET
  735.     
  736.     *-- was a 'fieldname' to get value from passed to function?
  737.     if isblank(cRetFld)                 && passed as a null
  738.         cRetFld = cSrchFld               && we'll return contents of same name
  739.                                          &&   as the search field
  740.     endif
  741.     
  742.     nScrRow = ScrRow()                  && get row for picklist
  743.     nScrCol = ScrCol()                  && get column for picklist
  744.     cCurrBuff = alias()                 && current buffer (work area)
  745.     lExact = set("EXACT") = "ON"        && store status of 'EXACT'
  746.     set exact on                        && we want 'exact' matches ...
  747.     
  748.     *-- deal with the 'lookup' file -- if not open, open it, if open,
  749.     *-- select it ...
  750.     if .not. used(cLookFile)            && file not open
  751.         select select()                  && find next open area
  752.         use &cLookFile                   && open file
  753.         lWasOpen = .f.
  754.     else
  755.         select (cLookFile)               && file IS open, move to it ...
  756.         lWasOpen = .t.
  757.     endif
  758.     
  759.     *-- deal with MDX tag for 'lookup' file ...
  760.     if len(trim(cTag)) = 0              && if a null tag was sent,
  761.         set order to Tag(1)              && set the order to first tag
  762.     else
  763.         set order to &cTag               && set it to what user passed.
  764.     endif
  765.     
  766.     *-- screen positions ...
  767.     nGetRow = row()                     && position of 'get' on screen
  768.     nGetCol = iif(isblank(xVarValue),col(),col()-len(&cRetFld))
  769.                                         && get column of 'get' ...
  770.     
  771.     *-- if field is empty, do a lookup, otherwise, look for it in table
  772.     if isblank(xVarValue)               && no data in field
  773.         lIsFound = .f.                   && automatic lookup
  774.     else
  775.         lIsFound = seek(xVarValue)       && look for it in table
  776.     endif
  777.     
  778.     *-- if not found, or field was empty, bring up the lookup ...
  779.     if .not. lIsFound                   && not in table
  780.         go top                           && move pointer to top of 'table'
  781.         *-- make sure it fits on screen
  782.         if cRetFld = cSrchFld            && one browse field
  783.             nWinWidth = len(&cSrchFld) + 3 && width
  784.             cBarFields = cSrchFld         && set the 'browse fields'
  785.         else                             && else multiple ....
  786.             nWinWidth = len(&cSrchFld)+len(&cRetFld)+5
  787.             cBarFields = cSrchFld+", "+cRetFld
  788.         endif
  789.         
  790.         *-- this is how we determine where to start the browse table ...
  791.         nScrCol = iif(nScrCol+nWinWidth>77,77-nWinWidth,nScrCol)
  792.         nScrRow = iif(nScrRow>14,14,nScrRow)
  793.         
  794.         *-- set it up ...
  795.         define window wPick from nScrRow,nScrCol+2 to ;
  796.             nScrRow+10,nScrCol+nWinWidth+2 panel
  797.         activate window wPick
  798.         *on key label ctrl-m keyboard chr(23) && when user presses <enter>,
  799.                                              && force an <enter> ... weird.
  800.         
  801.         *-- activate
  802.         browse fields &cBarFields freeze &cSrchFld noedit noappend;
  803.             nodelete nomenu window wPick
  804.         clear typeahead                  && in case they pressed the <Enter> key
  805.         
  806.         on key label ctrl-m              && reset
  807.         
  808.         release window wPick
  809.         
  810.         if lastkey() # 27                && not the <Esc> key
  811.             store &cRetFld to &cVarName   && put return value into var ...
  812.         else
  813.             lReturn = .F.
  814.         endif
  815.     else
  816.         store &cRetFld to &cVarName
  817.     endif
  818.     
  819.     @nGetRow, nGetCol get &cVarName     && display new value in field/memvar
  820.                                         &&  on screen
  821.     clear gets                          && clear gets from this function
  822.     
  823.     *-- reset work areas, and so on ...
  824.     if .not. lExact
  825.         set exact off
  826.     endif
  827.     if .not. lWasOpen
  828.         use
  829.     endif
  830.     if len(cCurrBuff) # 0
  831.         select (cCurrBuff)
  832.     else
  833.         select select()
  834.     endif
  835.     
  836. RETURN (lReturn)
  837. *-- EoF: Pick2()
  838.  
  839. FUNCTION ScrRow
  840. *-------------------------------------------------------------------------------
  841. *-- Programmer..: Malcolm C. Rubel
  842. *-- Date........: 11/xx/1991
  843. *-- Notes.......: Returns the postion of the current 'GET'. If memvar
  844. *--               nScrRow already exists, returns the value of that, unless
  845. *--               it's zero, in which case we return the current position.
  846. *--               This is part of PICK2.
  847. *-- Written for.: dBASE IV, 1.1
  848. *-- Rev. History: 05/15/1992 -- Ken Mayer (KENMAYER) to deal with a value of
  849. *--               0 for the nScrRow memvar.
  850. *-- Calls.......: None
  851. *-- Usage.......: ScrRow()
  852. *-- Example.....: nScrRow = ScrRow()
  853. *-- Returns.....: Numeric -- position of cursor on screen
  854. *-- Parameters..: None
  855. *-------------------------------------------------------------------------------
  856.  
  857.     if type('nScrRow') # 'N' .or. nScrRow = 0
  858.         return (row())
  859.     else
  860.         return (nScrRow)
  861.     endif
  862. *-- EoF: ScrRow()
  863.     
  864. FUNCTION ScrCol
  865. *-------------------------------------------------------------------------------
  866. *-- Programmer..: Malcolm C. Rubel
  867. *-- Date........: 11/xx/1991
  868. *-- Notes.......: Returns the postion of the current 'GET'. If memvar
  869. *--               nScrCol already exists, returns the value of that, unless
  870. *--               it's zero, in which case we return the current position.
  871. *--               This will also return a different value based on whether or
  872. *--               not the field has something in it or not ... This is part of
  873. *--               PICK2.
  874. *-- Written for.: dBASE IV, 1.1
  875. *-- Rev. History: 05/15/1992 -- Ken Mayer (KENMAYER) to deal with a value of
  876. *--               0 for the nScrCol memvar.
  877. *-- Calls.......: IsBlank()            FUNCTION in PICK2.PRG
  878. *-- Usage.......: ScrCol()
  879. *-- Example.....: nScrCol = ScrCol()
  880. *-- Returns.....: Numeric -- position of cursor on screen
  881. *-- Parameters..: None
  882. *-------------------------------------------------------------------------------
  883.  
  884.     if type('nScrCol') # 'N' .or. nScrCol = 0
  885.         if isblank(cRetFld)
  886.             return col() + len(cRetFld)
  887.         else
  888.             return col()
  889.         endif
  890.     else
  891.         return (nScrCol)
  892.     endif
  893.     
  894. *-- EoF: ScrCol()
  895.  
  896. FUNCTION YesNoCan
  897. *-------------------------------------------------------------------------------
  898. *-- Programmer..: Miriam Liskin
  899. *-- Date........: 06/11/1992
  900. *-- Notes.......: Asks a yes/no/cancel question in a dialog window/box
  901. *-- Written for.: dBASE IV, 1.1
  902. *-- Rev. History: 04/19/1991 - Modified by Ken Mayer to become a function
  903. *--               04/29/1991 - Modified to Ken Mayer add shadow
  904. *--               05/13/1991 - Modified to Ken Mayer remove need for extra 
  905. *--                            procedures (YES/NO) that were used for returning
  906. *--                            values from Menu
  907. *--                            (suggested by Clinton L. Warren (VBCES))
  908. *--               01/20/1992 - Modified by Martin Leon (HMan) to handle user
  909. *--                            pressing 'Y' or 'N' keys (with ON KEY ...).
  910. *--               06/11/1992 - Modified by Joey Carroll (JOEY) to allow
  911. *--                            answer choices to be "Yes", "No", or "Cancel"
  912. *--                            or to allow for parameters to pass the contents
  913. *--                            of the prompts. If none are passed, they default
  914. *--                            to "Yes", "No", "Cancel". Further modified to
  915. *--                            allow specification of location by row if 
  916. *--                            desired. Window size now varies as parameters 
  917. *--                            dictate.
  918. *-- Calls.......: SHADOW               Procedure in PROC.PRG
  919. *--               CENTER               Procedure in PROC.PRG
  920. *--               ISBLANK()            Function in MISC.PRG
  921. *--               COLORBRK()           Function in PROC.PRG
  922. *--               RECOLOR              Procedure in PROC.PRG
  923. *-- Called by...: Any
  924. *-- Usage.......: YesNoCan("<cAnswer>","<cMess1>","<cMess2>","<cMess3>",;
  925. *--                 "<cPrompt1>","<cPrompt2>","<cPrompt3>",;
  926. *--                  <nTopRow>,"<cColor>")
  927. *-- Example.....: cAnswer="Y"
  928. *--               cAnswer=YesNoCan(cAnswer,"*** Warning ***",;
  929. *--                            "A serious error has occured.",;
  930. *--                             "Choose carefully.","Proceed",;
  931. *--                             "Retry","Cancel",10,;
  932. *--                             "w+/r,n/w,w+/r")
  933. *--               do case
  934. *--                  case cAnswer="Y"    && OR case pad()=PPAD1
  935. *--                     * do your thing
  936. *--                  case cAnswer="N"    && OR case pad()=PPAD2
  937. *--                     skip
  938. *--                  case cAnswer="C"    && OR case pad()=PPAD3
  939. *--                     * e.g. - return
  940. *--               endcase
  941. *--
  942. *--                 The middle set of colors should be different, as they
  943. *--                 will be the colors of the YES/NO selections ...
  944. *--                 Options may be blank by using nul values ("")
  945. *-- Returns.....: First character of selected pad
  946. *-- Parameters..: cAnswer  = default value (Yes or No or Cancel) for menu
  947. *--               cMess1   =  First line of Message
  948. *--               cMess2   =  Second line of message
  949. *--               cMess3   =  Third line of message
  950. *--               cPrompt1 =  Optional prompt for left pad
  951. *--               cPrompt2 =  Optional prompt for middle pad
  952. *--               cPrompt3 =  Optional prompt for right pad
  953. *--               nTopRow  =  Optional top row of window
  954. *--               cColor   =  Optional colors for window/menu/box
  955. *-------------------------------------------------------------------------------
  956.  
  957.    parameter cAnswer,cMess1,cMess2,cMess3,;
  958.       cPrompt1,cPrompt2,cPrompt3,nTopRow,cColor
  959.    private nLMargin,nRMargin,lWrap,nTopRowMax,cKey1,cKey2,cKey3,nWinWidth
  960.     private cPrompt1,cPrompt2,cPrompt3,cCurColor,cTempCol
  961.     
  962.     *-- save screen so we can restore ...
  963.    save screen to sYesNoCan
  964.     *-- save current color setup
  965.     cCurColor = set("ATTRIBUTES")
  966.     *-- set new colors based on passed parm
  967.     cTempCol = colorbrk(cColor,1)
  968.     set color of normal to &cTempCol
  969.     set color of box    to &cTempCol
  970.     cTempCol = colorbrk(cColor,2)
  971.     set color of highlight to &cTempCol
  972.     cTempCol = colorbrk(cColor,3)
  973.     set color of highlight to &cTempCol
  974.     
  975.    * locate top row of window
  976.    nTopRowMax = iif(set("STATUS") = "OFF",17,14) && protect Status Line
  977.    nTopRow = iif(isblank(nTopRow),14,nTopRow) && no parameter passed
  978.    nTopRow = min(nTopRowMax,nTopRow)
  979.  
  980.    * set pad prompts if none passed
  981.    cPrompt1 = iif(isblank(cPrompt1),"Yes",cPrompt1)
  982.    cPrompt2 = iif(isblank(cPrompt2),"No",cPrompt2)
  983.    cPrompt3 = iif(isblank(cPrompt3),"Cancel",cPrompt3)
  984.    cAnswer = iif(isblank(cAnswer),cPrompt1,cAnswer)
  985.  
  986.    * determine how wide the window needs to be
  987.    nWinWidth = max(19,len(cPrompt1 + cPrompt2 + cPrompt3) +13)
  988.    nWinWidth = max(nWinWidth,len(cMess1)+4)
  989.    nWinWidth = max(nWinWidth,len(cMess2)+4)
  990.    nWinWidth = max(nWinWidth,len(cMess3)+4)
  991.    * and center it
  992.    define window wYesNoCan from nTopRow,40-(nWinWidth+2)/2 ;
  993.       to nTopRow+7,40+(nWinWidth+2)/2 double color &cColor.
  994.    define menu mYesNoCan
  995.    define pad pPad1 of mYesNoCan Prompt "["+cPrompt1+"]" ;
  996.       at 5,02
  997.    * center middle prompt between other two, not center of window
  998.    define pad pPad2 of mYesNoCan Prompt "["+cPrompt2+"]"  ;
  999.       at 5,((nWinWidth-len(cPrompt2))/2+(len(cPrompt1)-len(cPrompt3))/2)
  1000.    define pad pPad3 of mYesNoCan Prompt "["+cPrompt3+"]"  ;
  1001.       at 5,(nWinWidth-3)-(len(cPrompt3))
  1002.    on selection pad pPad1 of mYesNoCan deactivate menu
  1003.    on selection pad pPad2 of mYesNoCan deactivate menu
  1004.    on selection pad pPad3 of mYesNoCan deactivate menu
  1005.     
  1006.    do shadow with nTopRow,40-(nWinWidth+2)/2,nTopRow+7,40+(nWinWidth+2)/2
  1007.    activate window wYesNoCan
  1008.     
  1009.    do center with 0,nWinWidth,"",cMess1       && center the text
  1010.    do center with 2,nWinWidth,"",cMess2
  1011.    do center with 3,nWinWidth,"",cMess3
  1012.  
  1013.    *-- deal with user pressing first key of prompt
  1014.    cKey1 = left(cPrompt1,1)
  1015.    cKey2 = left(cPrompt2,1)
  1016.    cKey3 = left(cPrompt3,1)
  1017.  
  1018.    on key label &cKey1. keyboard iif( PAD() = "PPAD1", "", ;
  1019.       iif(pad() = "PPAD2", chr(19),CHR(4) ))+chr(13)
  1020.    on key label &cKey2. keyboard iif( PAD() = "PPAD2",  "", ;
  1021.       iif(pad() = "PPAD1",CHR(4),chr(19) ))+chr(13)
  1022.    on key label &cKey3. keyboard iif( PAD() = "PPAD3", "", ;
  1023.       iif(pad() = "PPAD2", CHR(4),chr(19) ))+chr(13)
  1024.    clear typeahead
  1025.     *-- otherwise deal with regular "menu" abilities
  1026.    do case
  1027.       case cAnswer=cKey1
  1028.            activate menu mYesNoCan pad pPad1
  1029.       case cAnswer=cKey2
  1030.            activate menu mYesNoCan pad pPad2
  1031.       case cAnswer=cKey3
  1032.            activate menu mYesNoCan pad pPad3
  1033.    endcase
  1034.     
  1035.     *-- clear out ON KEY settings ...
  1036.    on key label &cKey1.
  1037.    on key label &cKey2.
  1038.    on key label &cKey3.
  1039.     *-- reset environment
  1040.    deactivate window wYesNoCan
  1041.    release window wYesNoCan
  1042.    restore screen from sYesNoCan
  1043.    release screen sYesNoCan
  1044.    release menu mYesNoCan
  1045.     do recolor with cCurColor
  1046.  
  1047. RETURN upper(substr(prompt(),2,1))
  1048. *-- EoF: YesNoCan()
  1049.  
  1050. PROCEDURE ProgBar
  1051. *-------------------------------------------------------------------------------
  1052. *-- Programmer..: Joey D. Carroll (JOEY)
  1053. *-- Date........: 06/28/1992
  1054. *-- Notes.......: A visual indicator of program activity, i.e. shows
  1055. *--               user program didn't die during long processes which
  1056. *--               do not normally show 'on screen'.  Serves same purpose
  1057. *--               as MONITOR, but is more graphic.
  1058. *--               For best appearance, set cursor 'off' from calling
  1059. *--               program, outside of the loop which calls PROGBAR.
  1060. *-- Written for.: dBASE IV, 1.5
  1061. *-- Rev. History: None
  1062. *-- Calls.......: None
  1063. *-- Called by...: Any
  1064. *-- Usage.......: do PROGBAR with <nQuan>,<cWindCol>,<cFillCol1>,cFillCol2>, ;
  1065. *--                   <cMessage>,<nWindWidth>
  1066. *-- Example.....: *-- determine what process will be monitored and what the
  1067. *--               *-- final value will be, e.g. nReccount = reccount()
  1068. *--               use <anyfile>
  1069. *--               nReccount = reccount()
  1070. *--               set cursor off
  1071. *--               scan
  1072. *--                  do progbar with nReccount,",,w+/n","w+/r","w+/g", ;
  1073. *--                     "Processing records.  Be patient.",40
  1074. *--                  *-- do some needed process here
  1075. *--               endscan
  1076. *--               *-- cleanup
  1077. *-- Returns.....: None
  1078. *-- Parameters..: nQuan     = maximum number of iterations
  1079. *--               cWindCol  = the window colors
  1080. *--               cFillCol1 = color of ruler before process
  1081. *--               cFillCol2 = color of ruler after process
  1082. *--               cMessage  = message displayed to user, may be "".
  1083. *--               nWindWid  = (optional) desired width of ruler window.  If
  1084. *--                               not specified, width of screen.  If
  1085. *--                               specified, will not be less than length of
  1086. *--                               message.
  1087. *-------------------------------------------------------------------------------
  1088.  
  1089.    parameters nQuan,cWindCol,cFillCol1,cFillCol2,cMessage,nWindWidth
  1090.    private lMessage,x, nParms
  1091.    lMessage  = iif(.not. isblank(cMessage), .t., .f.)  && was message passed?
  1092.     *-- find out # of parameters passed ...
  1093.     if val(right(version(),3)) > 1.1
  1094.         nParms = pcount()
  1095.     else
  1096.         nParms = 6
  1097.     endif
  1098.    nWindWidth = iif(nParms = 6,nWindWidth,78) && all the way if width not passed
  1099.    nWindWidth = min(nWindWidth,78)            && width param > 78 not allowed
  1100.    *-- window width can't be narrower than messsage, so....
  1101.    nWindWidth = iif(lMessage,max(nWindWidth,len(cMessage) + 2),nWindWidth)
  1102.    *-- skip this section if we've been here before
  1103.    *-- this procedure called from inside a loop
  1104.    *-- following section ignored except on first iteration thru loop
  1105.    if type("nTimes") = "U"  && check to see if we been here before
  1106.       save screen to sProgBar
  1107.       public nFactor,nTimes  && make these available on all iterations
  1108.       nProgLine = iif(set("status") = "ON",20,22)  && don't overwrite status
  1109.       *-- determine how wide the window needs to be
  1110.       define window wProgBar from ;
  1111.          nProgLine - iif(lMessage, 2, 1),(80 - (nWindWidth + 2)) / 2 ;
  1112.          to nProgLine + 1,(80 + (nWindWidth + 2)) / 2 - 1 ;
  1113.          double color &cWindCol
  1114.       activate window wProgBar
  1115.       @ 0,0 say replicate(".",nWindWidth - 1)  && the ruler
  1116.       @ 0,0 say "0%"                        && and some gradation %'s
  1117.       @ 0,nWindWidth / 4 - 2 say "25%"
  1118.       @ 0,nWindWidth / 2 - 2 say "50%"
  1119.       @ 0,3*(nWindWidth / 4) - 2 say "75%"
  1120.       @ 0,nWindWidth - 4 say "100%"
  1121.       @ 0,0 fill to 0,nWindWidth - 1 color &cFillCol1  && color of ruler before process
  1122.       if lMessage
  1123.          @ 1,(nWindWidth - (len(cMessage))) / 2 say cMessage color &cFillCol1
  1124.          @ 1,0 fill to 1,nWindWidth - 1 color &cFillCol1
  1125.       endif
  1126.       nFactor = nQuan/nWindWidth   && e.g. how many records per bar part(cols)
  1127.       nTimes = 0  && times thru loop
  1128.    endif      && type("nTimes") = "U"
  1129.  
  1130.    *-- this section will be processed as many times as required by nQuan
  1131.    nTimes = nTimes + 1
  1132.    @ 0,0 fill to 0,int(nTimes / nFactor) ;
  1133.          - iif(int(nTimes / nFactor) - 1 >= 0, 1, 0) ;
  1134.          color &cFillCol2    && color of ruler as processing takes place
  1135.    if nTimes = nQuan  && we done
  1136.       x = inkey(.5)   && leave on screen just a liitle while after completion
  1137.       *-- cleanup your mess
  1138.       deactivate window wProgBar
  1139.       release window wProgBar
  1140.       restore screen from sProgBar
  1141.       release screen sProgBar
  1142.       release nProgBar,nFactor,nTimes,lMessage,x
  1143.    endif  && nTimes = nQuan
  1144. RETURN
  1145. *-- EoP: ProgBar
  1146.  
  1147. PROCEDURE ProgBar2
  1148. *-------------------------------------------------------------------------------
  1149. *-- Programmer..: Joey D. Carroll (JOEY)
  1150. *-- Date........: 06/28/1992
  1151. *-- Notes.......: A crippled version of PROGBAR for those who want it simple.
  1152. *--               A visual indicator of program activity, i.e. shows
  1153. *--               user program didn't die during long processes which
  1154. *--               do not normally show 'on screen'.  Serves same purpose
  1155. *--               as MONITOR, but is more graphic.
  1156. *--               For best appearance, set cursor 'off' from calling
  1157. *--               program, outside of the loop which calls PROGBAR.
  1158. *-- Written for.: dBASE IV, 1.5
  1159. *-- Rev. History: None
  1160. *-- Calls.......: None
  1161. *-- Called by...: Any
  1162. *-- Usage.......: do PROGBAR2 with <nQuan>,<cWindCol>,<cFillCol1>,cFillCol2>
  1163. *-- Example.....: *-- determine what process will be monitored and what the
  1164. *--               *-- final value will be, e.g. nReccount = reccount()
  1165. *--               use <anyfile>
  1166. *--               nReccount = reccount()
  1167. *--               set cursor off
  1168. *--               scan
  1169. *--                  do progbar2 with nReccount,",,w+/n","w+/r","w+/g"
  1170. *--                  *-- do some needed process here
  1171. *--               endscan
  1172. *--               *-- cleanup
  1173. *-- Returns.....: None
  1174. *-- Parameters..: nQuan     = maximum number of iterations
  1175. *--               cWindCol  = the window colors
  1176. *--               cFillCol1 = color of ruler before process
  1177. *--               cFillCol2 = color of ruler after process
  1178. *-------------------------------------------------------------------------------
  1179.  
  1180.    parameters nQuan,cWindCol,cFillCol1,cFillCol2   && e.g. how many records
  1181.    private nWindWidth
  1182.    nWindWidth = 78  && hard coded, wall to wall
  1183.  
  1184.    *-- skip this section if we've been here before
  1185.    *-- this procedure called from inside a loop
  1186.    *-- following section ignored except on first iteration thru loop
  1187.    if type("nTimes") = "U"
  1188.       save screen to sProgBar
  1189.       public nFactor,nTimes
  1190.       if set("status") = "ON"  && different location if status "on"
  1191.          define window wProgBar from 19,0 to 21,79 double color &cWindCol
  1192.       else
  1193.          define window wProgBar from 21,0 to 23,79 double color &cWindCol
  1194.       endif   && set("status") = "ON"
  1195.       activate window wProgBar
  1196.       @ 0,0 say replicate(".",nWindWidth - 1)  && the ruler
  1197.       @ 0,0 say "0%"                        && and some gradation %'s
  1198.       @ 0,nWindWidth / 4 - 2 say "25%"
  1199.       @ 0,nWindWidth / 2 - 2 say "50%"
  1200.       @ 0,3*(nWindWidth / 4) - 2 say "75%"
  1201.       @ 0,nWindWidth - 4 say "100%"
  1202.       @ 0,0 fill to 0,nWindWidth - 1 color &cFillCol1  && color of ruler before process
  1203.       nFactor = nQuan/nWindWidth   && e.g. how many records per bar part(cols)
  1204.       nTimes = 0  && times thru loop
  1205.    endif      && type("nTimes") = "U"
  1206.  
  1207.    *-- the section will be processed as many times as required by nQuan
  1208.    nTimes = nTimes+1
  1209.    @ 0,0 fill to 0,int(nTimes/nFactor) ;
  1210.          - iif(int(nTimes/nFactor) -1 >= 0,1,0) ;
  1211.          color &cFillCol2    && color of ruler as processing takes place
  1212.  
  1213.    if nTimes = nQuan  && we done
  1214.       x = inkey(.5)   && leave on screen just a liitle while after completion
  1215.       * cleanup your mess
  1216.       deactivate window wProgBar
  1217.       release window wProgBar
  1218.       restore screen from sProgBar
  1219.       release screen sProgBar
  1220.       release nProgBar,nFactor,nTimes,nWindWidth,x
  1221.    endif
  1222.  
  1223. RETURN
  1224. *-- EoP: PROGBAR2
  1225.  
  1226. *-------------------------------------------------------------------------------
  1227. *-- Function USED is here from the FILES.PRG file, for use with PICK2 above.
  1228. *-------------------------------------------------------------------------------
  1229.  
  1230. FUNCTION Used
  1231. *-------------------------------------------------------------------------------
  1232. *-- Programmer..: Ken Mayer (KENMAYER)
  1233. *-- Date........: 05/15/1992
  1234. *-- Notes.......: Created because the picklist routine by Malcolm Rubel
  1235. *--               from DBA Magazine (11/91) calls a function that checks
  1236. *--               to see if a DBF file is open ... the one he calls doesn't
  1237. *--               exist. This is designed to loop until all possible work
  1238. *--               areas are checked (for 1.1 this maxes at 10, for 1.5 it's
  1239. *--               40 ... this routine checks both). Written for PICK2,
  1240. *--               this should be transportable ...
  1241. *-- Written for.: dBASE IV, 1.5
  1242. *-- Rev. History: None
  1243. *-- Calls.......: None
  1244. *-- Usage.......: Used("<cFile>")
  1245. *-- Example.....: if used("Library")
  1246. *--                  select library
  1247. *--               else
  1248. *--                  select select()
  1249. *--                  use library
  1250. *--               endif
  1251. *-- Returns.....: Logical (.t. if file is in use, .f. if not)
  1252. *-- Parameters..: cFile = file to check for
  1253. *-------------------------------------------------------------------------------
  1254.     
  1255.     parameters cFile
  1256.     private lReturn, nAlias, nMax
  1257.  
  1258.     *-- maximum # of work areas is based on version of dBASE ...
  1259.     *-- if 1.5 or higher, the max is 40, if 1.1 or lower, it's 10.
  1260.     if val(right(version(),3)) > 1.1
  1261.         nMax = 40
  1262.     else
  1263.         nMax = 10
  1264.     endif
  1265.     
  1266.     *-- a small loop
  1267.     nAlias = 0                          && start at 0, increment as we go
  1268.     lReturn = .f.                       && assume it's not open
  1269.     do while nAlias < nMax              && loop until we find it, or we max
  1270.         nAlias = nAlias + 1              && increment
  1271.         if alias(nAlias) = upper(cFile)  && is THIS the one?
  1272.             lReturn = .t.                 && if so, set lReturn to .t.
  1273.             exit                          &&   and exit the loop
  1274.         endif  && if alias ...
  1275.     enddo
  1276.     
  1277. RETURN lReturn
  1278. *-- EoF: Used()
  1279.  
  1280. *-------------------------------------------------------------------------------
  1281. *-- EoP: SCREEN.PRG
  1282. *-------------------------------------------------------------------------------
  1283.