SP Popup Functions

 TAGMARRAY()    Tag elements in muti-dimensioned array
 STAGFIELDS()   Tag fields
 UNBOX()        Removes a box created by makebox()
 SPOPORDER()    Popup allows user to change viewing (index) order
 SPOPSEEK()     Popup seek based on present index keys
 VIEWMEMOS()    Popup viewing (non-edit mode) of memos
 VERTVIEW()     Pops up a vertical view of the current record
 TAGARRAY()     Tag selected elements of an array
 SGETMANY()     Virtual (scrolling) gets in a popup box
 AMSG()         Pop up message box for an array of messages
 POPUPDIR()     Popup of a given directory for file selection
 POPREAD()      Pops up a box with 1-5 say-get combinations
 POPVDATE()     Pops up a picklist of virtual dates
 POPEX()        Pops up an achoice for a certain filespec
 POPMONTH()     Popup month selection
 POPCOLSEL()    Popup color grid for selecting a single color
 PROGINDEX()    Perform an index with a progress box
 PROGEVAL()     Perform a Database DBEVAL() with a progress box
 POPVYEAR()     Pops up a picklist of virtual years
 PROGCOUNT()    Perform a count with a progress box
 PROGDISP()     Displays progress bar in box created with PROGON()
 PROGOFF()      Removes a progress bar box created by PROGON()
 MESSYN()       Popup YesNo prompt box
 MCHOICE()      Creates a box for an Achoice call
 MFIELDS()      Pops up an selection box for current dbf fields
 GETDATE()      Point and shoot calendar
 MAKEBOX()      Draws a box on the screen with optional shadow,
                returns saved screen
 PLSWAIT()      Pops up a 'Please Wait' window or removes it
 ONE_READ()     Pop-up window with 1-4 Say/Get combinations
 MULTMSGYN()    Multi-line popup message - yes -no
 MFIELDSTYPE()  Pops up a list of fields of given type(s)
 MSG()          Displays up to a 9 line message in a window
 HARDCOPY()     Prints current record or memo fields to printer
 EDITMEMO()     Performs a windowed memoedit() on a memo field
 ASCIITABLE()   Pops up an ASCII table for character selection
 DELREC()       Dialog box to delete/undelete current record
 EDITMEMOV()    Performs a windowed memoedit() on a string
 BROWSE2D()     Popup tbrowse of 2 dimension array (array of arrays)
 SBUNSHADOW()   Removes shadow drawn with SBSHADOW()
 ABORT()        Pops up dialog box asking: Abort  Don't Abort
 SBSHADOW()     Draw a shadow around a box
 PROGON()       Initialize and display a progress bar box
 QUIKREPORT()   Runtime pre-defined report printing module
 P_READY()      Determines if printer is ready, prompts user
 SACHOICE()     Achoice replacement, uses TBROWSE, accepts exception
 S1LABEL()      Prints a single label
 GETCALC()      Pops up a quick 'solar' calculator





  SGETMANY()    Virtual (scrolling)  gets in a popup box

  <lSave> => False if ESC pressed, true otherwise


  READs a series of GETs in a popup box, with the
  ability to scroll the GETs up/down when there are more GETs than fit in
  the box.

  <aGets> is an array of get objects. There are two
  ways to create this:

      1.    Use GETNEW() (the Clipper function) to create each
            individual get object. Get row and column do not
            matter - they will be adjusted.

            GET postblock and preblock (valid and when)
            may be assigned as normal. As each new GET object is created,
            add it to an array.

            Pass this array as <aGets>.

      2.    Use the normal @row,col GET... commands, but to a
            location off the screen - otherwise the gets will DISPLAY
            as you are assigning them.

            @MAXROW()+1,MAXCOL()+1 GET... works for me.

  Using @...GET automatically places new get
  objects in the global array GETLIST. Pass GETLIST as <aGets>.

  <aDesc> this is an array of descriptions for each
  get. (the SAY portion). These will be displayed to the left of
  the get.

  <nTop,nLeft,nBottom,nRight> are the dimensions of the
  popup box. The Editing area will be the inside dimensions of this
  box. Make sure there's room!

  [cTitle] is a string to be used for the title.
  Displayed at <nTop>,<nLeft>+1

  [cFoot] is now ignored. This parameter used to be the footer. It
  is now just a placeholder for downward compatibility.

  [nPadding] is for the number of spaces of padding
  between the box frame and the editing area. The default is 0,
  which places the editing area at
  nTop+1,nLeft+1,nBottom-1,nRight-1. A [nPadding] of 1 would place
  the editing area at nTop+2,nLeft+2,nBottom-2,nRight-2 etc.


   local i
   local aDesc := {}
   local aGets
   aGets := dbf2array()

   for i = 1 to len(aGets)
     @maxrow()+1,maxcol()+1 get aGets[i]

         "Editing","ESC quits, F10 saves",1)

  Do not pass a 0 length string as a GET