/* $DOC$
   $NAME$
      ft_ArEdit()
   $CATEGORY$
      Array
   $ONELINER$
      2 dimensional array editing function using TBrowse
   $SYNTAX$
      ft_ArEdit( <nTop>, <nLeft>, <nBottom>, <nRight>, <Array Name>, ;
         <nElem>, <aHeadings>, <aBlocks> [, <bGetFunc> ] ) -> xElement
   $ARGUMENTS$
      <nTop>, <nLeft>, <nBottom>, <nRight> are coordinates for TBrowse

      <Array Name> is name of 2 dimensional to array edit

      <nElem>      is pointer for element in array

      <aHeadings>  is array of column headings

      <aBlocks>    is array of blocks describing each array element

      [ <bGetFunc> ] is get editing function for handling individual elements
   $RETURNS$
      Value of element positioned on when exit ft_ArEdit()
      The type of this value depends on what is displayed.
   $DESCRIPTION$
      This function allows you to position yourself in an array,
      add and delete rows with the <F7> and <F8> keys,
      and pass a UDF with information to edit the individual gets.
   $EXAMPLES$
      ft_ArEdit( 3, 5, 18, 75, ar, @nElem, aHeadings, aBlocks )

      // This example will allow you to browse a 2 dimensional array
      // But you can't edit it since there is no GetBlock UDF
      // It allows the user to hit ENTER to select an element or ESC to
      // return 0

      // This second example shows how to edit a 2 dimensional array
      // as might be done to edit an invoice

      LOCAL i, ar[ 3, 26 ], aBlocks[ 3 ], aHeadings[ 3 ]
      LOCAL nElem := 1, bGetFunc

      // Set up two dimensional array "ar"

      FOR i := 1 TO 26
         ar[ 1, i ] := i                         //  1  ->  26  Numeric
         ar[ 2, i ] := Chr( Asc( "A" ) + i - 1 ) // "A" -> "Z"  Character
         ar[ 3, i ] := Chr( Asc( "Z" ) - i + 1 ) // "Z" -> "A"  Character
      NEXT

      // SET UP aHeadings Array for column headings

      aHeadings  := { "Numbers", "Letters", "Reverse" }

      // Need to set up individual array blocks for each TBrowse column

      aBlocks[ 1 ] := {|| Str( ar[ 1, nElem ], 2 ) } // prevent default 10 spaces
      aBlocks[ 2 ] := {|| ar[ 2, nElem ] }
      aBlocks[ 3 ] := {|| ar[ 3, nElem ] }

      // set up TestGet() as the passed Get Function so ft_ArEdit() knows how
      // to edit the individual gets.

      bGetFunc   := {| b, ar, nDim, nElem | TestGet( b, ar, nDim, nElem ) }
      SetColor( "N/W, W/N, , , W/N" )
      CLS
      ft_ArEdit( 3, 5, 18, 75, ar, @nElem, aHeadings, aBlocks, bGetFunc )
   $END$
 */
