TBrowse with Array

527 views
Skip to first unread message

clipper6

unread,
Sep 2, 2012, 9:44:10 PM9/2/12
to harbou...@googlegroups.com
Below is the tbrowse code i'm testing but when i edit a cell the change is lost when i press enter. How do i keep the changes so i can the data later to a postgres table.


#include "inkey.ch"

PROCEDURE Main()

   LOCAL lContinue   := .T. ,;
         nKeyPressed := 0,;
         nArryRowNo  := 1        
        
   LOCAL nTBrWTop  :=   5,;   // TBrowse Window Top
         nTBrWLeft :=  18,;   // TBrowse Window Left
         nTBrWBott :=  20,;   // TBrowse Window Bottom
         nTBrWRigt :=  62     // TBrowse Window Right
        
  
   SetMode( 25, 80 )
   CLS
   SETCOLOR( "W/GB+", "+GB/W" )
  
   aAgenda := { { "Alvarez",   "Alberto",   "543-7898" } ,;
                { "Pradon",    "Alejandra", "???-????" } ,;
                { "Gonzalez",  "Ambo",      "437-8473" } ,;
                { "Vinazzi",   "Amigo",     "394-5983" } ,;
                { "Samarbide", "Armando",   "854-7873" } ,;
                { "Barriga",   "Carlos",    "394-9654" } ,;
                { "Pedemonti", "Flavio",    "534-7984" } ,;
                { "Mulder",    "Fox",       "324-6432" } ,;
                { "Batistuta", "Gol",       "485-2843" } ,;
                { "Simpson",   "Homer",     "555-5555" } ,;
                { "Kirk",      "James",     "346-9873" } ,;
                { "Borges",    "Javier",    "326-9430" } ,;
                { "Smith",     "John",      "123-1234" } ,;
                { "Gomez",     "Juan",      "583-4832" } ,;
                { "Smart",     "Max",       "432-5892" } ,;
                { "Reyes",     "Monica",    "432-5836" } ,;
                { "Flanders",  "Ned",       "435-3211" } ,;
                { "Grillo",    "Pepe",      "894-2332" } ,;
                { "Fernandez", "Raul",      "321-4332" } }
               
   nAgenSize := LEN( aAgenda )
  
   * Draw a box around Browse window
  
   DISPBOX( nTBrWTop-1, nTBrWLeft-1, nTBrWBott+1, nTBrWRigt+1 ) 
  
   * Define a new TBrowse object
  
   oBrowse := TBrowseNew( nTBrWTop, nTBrWLeft, nTBrWBott, nTBrWRigt )
  
   * Define navigation rules between browse's rows
  
   oBrowse:SkipBlock := { | nSkip | TbrASkipper( nSkip, @nArryRowNo ) }
  
   oBrowse:HeadSep := 'ÄÂÄ'      // Header Seperator
   oBrowse:ColSep  := ' ³ '      // Column Seperator 
  
   * Define columns with TBColumn and add them to the TBrowse object
  
   oBrowse:AddColumn( TBColumnNew( "Surname", ;
                      { || PADR( @aAgenda[ nArryRowNo, 1 ], 15 ) } ))
                   
   oBrowse:AddColumn( TBColumnNew( "Name", ;
                      { || PADR( @aAgenda[ nArryRowNo, 2 ], 10 ) } ))
                   
   oBrowse:AddColumn( TBColumnNew( "Tlf", ;
                      { || PADR( @aAgenda[ nArryRowNo, 3 ], 10 ) } ))
  
   WHILE lContinue                             // Browse's loop   
      WHILE .NOT. oBrowse:stabilize() ; ENDDO     // Stabilizing loop
      nKeyPressed := INKEY(0)
      lContinue := TBrApplyKey( oBrowse, nKeyPressed )
      oBrowse:refreshAll()
   ENDDO
  
   USE
  
   SETPOS( 23, 0 )  
   WAIT "EOF TBrowseArr"
  
RETURN // TBRowseArr-Main()

*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/*
   Navigation rules between browse's rows
*/

FUNCTION TbrASkipper( nToSkip, nArryRowNo )
 
   IF nToSkip > 0
      IF ( nToSkip + nArryRowNo  ) > nAgenSize
            nToSkip := nAgenSize - nArryRowNo
        ENDIF
    ELSE
        IF ( nToSkip + nArryRowNo  ) < 1
            nToSkip := 1 - nArryRowNo
        ENDIF
    ENDIF

    nArryRowNo += nToSkip
  
RETURN nToSkip // TbrASkipper()

*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/*
   Handle the (some) keystrokes of user
*/

FUNCTION TBrApplyKey( oBrowse, nKey )

    LOCAL lRVal := .T.
  
    DO CASE
        CASE nKey == K_UP
            oBrowse:Up()
        CASE nKey == K_LEFT
            oBrowse:lEFT()
        CASE nKey == K_RIGHT
            oBrowse:Right()
        CASE nKey == K_DOWN
            oBrowse:down()
        CASE nKey == K_HOME
            oBrowse:home()
        CASE nKey == K_END
            oBrowse:end()
        CASE nKey == K_PGUP
            oBrowse:pageUp()
        CASE nKey == K_PGDN
            oBrowse:pageDown()
        CASE nKey == K_CTRL_PGDN
            oBrowse:goBottom()
        CASE nKey == K_CTRL_PGUP
            oBrowse:goTop()
        CASE nKey == K_ESC
            // End of Browse and program
            lRVal := .F.
        CASE nKey == K_RETURN                && Enable date entry on RETURN.
            GetIt(oBrowse)   
    ENDCASE
  
RETURN lRVal // TBrApplyKey()

*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* A function to provide data entry for the browse.
FUNCTION GETIT (oBrowse)                && Object is passed as a parameter.
    LOCAL nGetCol                        && GET Column.
    LOCAL oGet                            && GET object.
   
    /* Get teh particulars on the column (cell) to edit and crate
     a GET object to use for the entry.    */
    nGetCol := oBrowse:GetColumn(oBrowse:colpos)
    oGet := GetNew(Row(), Col(), nGetCol:block, nGetCol:heading)
    SET CURSOR ON                            &&hide the editing cusor and
    ReadModal({oGet})                        && do the READ.
    oBrowse:refreshCurrent()                    && Update the current row of teh
                                                && browse.
    SET CURSOR OFF                                && Hide the editing cursor again.
    IF LastKey() == K_UP .OR.         ;        && Detemine if one of these
        LastKey() == K_DOWN .OR.    ;        && keystroke was used to
        LastKey() == K_PGUP .OR.    ;        && terminate the READ. If so
        LastKey() == K_PGDN .OR.    ;       && put the key back into the
        LastKey() == K_ESC                    && keyboard buffer.
        KEYBOARD Chr(LastKey())
    ENDIF
   
    RETURN .T.     && Terminate the GetIt () function.                           
*end function           

clipper6

unread,
Sep 4, 2012, 3:38:18 AM9/4/12
to harbou...@googlegroups.com
I got the code below from another forum. How do I add a picture so that it is formatted when displayed on the tbrowse and also on editing. Please help.

// On Monday, November 28, 2011 10:19:44 PM UTC+8, Paul
#include "set.ch"

#include "inkey.ch"
#include "setcurs.ch"
#include "achoice.ch"

FUNCTION Main()

   LOCAL aArr, aCols
   LOCAL nR, cScrSave

   Set( _SET_DATEFORMAT, "dd.mm.yy" )
   Set( _SET_EPOCH, 1951 )

   Scroll() ; SetPos( 0, 0 )

   ?? " t_brw_a1.prg - Demo/R&D - Browse/Edit array ..."
  #ifdef __XHARBOUR__
   //-------------------------
   ?? "   (x)Hb"
  #else // !__XHARBOUR__
   //-------------------------
   ?? "   Clipper"
  #endif

   aCols := { "#", "Col2", "Col3", "Col4" }
     
   aArr  := { ;
     { "1", "bill    ", "smith", 123.45 }, ;
     { "2", "joseph", "RC23", 987.34 }, ;
     { "3", "danny", "RC33", 8765.45 }, ;
     { "4", "ernie", "RC43", 939.89}, ;
     { "5", "karla", "RC53", 5320.12 }, ;
     { "6", "james", "RC63", 4532.11 }, ;
     { "7", "john", "RC73", 1521.56}  ;
   }
   
   nR := Row() + 2

   cScrSave := SaveScreen()
   brwArrEdit( nR, 1, nR+5, 40, aArr, aCols, /*cUDFb*/, /*cUDFm*/ )

   //RestScreen( ,,,,cScrSave )
   SetPos( nR+5, 0 )
   ? ; ?
    ? aArr[1,2]
RETURN 0
// -------------------------------------------------------------

#xcommand      STABILIZE <oB> INKEY [TO] <x> ;
  =>   DispBegin() ;;
       WHILE !<oB>:Stabilize() .AND. ( <x> := InKey() ) == 0 ;;
       END ;;
       DispEnd()

FUNCTION brwArrEdit( nT, nL, nB, nR, aArr, aCols, cUDFb, cUDFm )

   local oBrw, oCol, nKey
   local nCurs := SetCursor()
   local nIx

   //Note: MUST be private - Get/Set column block !
   private nArRow  := 1
   private nArRowM := Len( aArr )

   if nArRowM == 0
      return -1
   endif

   SetCursor( SC_NONE )

   oBrw := TBrowseNew( nT, nL, nB, nR )

   oBrw:SkipBlock     := {|n| Skiper( n, @nArRow ) }
   oBrw:GoTopBlock    := {||  nArRow := 1 }
   oBrw:GoBottomBlock := {||  nArRow := nArRowM }
   oBrw:headSep       := "=="
   oBrw:ColSep        := Chr( 32 )

   // Add columns
   FOR nIx := 1 TO Len( aCols )
      oCol := TBColumnNew( aCols[ nIx ], ABrowseBlock( aArr, nIx ) )

      oBrw:AddColumn( oCol )
   NEXT // nIx

   // Browse ... / Edit ...
   // ---------------------
   WHILE .T.
      STABILIZE oBrw INKEY TO nKey

      IF oBrw:Stable
         nKey := InKey( 0 )
      ENDIF

      IF ! TbMoveCursor( nKey, oBrw )
         DO CASE
         CASE nKey == K_ESC
            nArRow := 0
            EXIT

         CASE nKey == K_ENTER
                //Alert( "K_ENTER is pressed!" )
            DoGet( oBrw )

         OTHERWISE
            oBrw:ForceStable()
            IF cUDFb <> Nil
               nIx := &( cUDFb+"(" + Str( nKey ) +","+ Str( nArRow ) +")" )
               IF nIx == AC_ABORT
                  EXIT

               ELSEIF nIx == AC_SELECT
                  EXIT

               ELSEIF nIx == AC_REDRAW
                  nArRowM := Len( aArr )
                  oBrw:RefreshAll()
                  oBrw:Stabilize()

               ENDIF
            ENDIF
         END // case

      ELSE
         IF ! Empty( cUDFm )
            oBrw:ForceStable()
            &( cUDFm+"(" + Str( nKey ) +"," + Str( nArRow ) +")" )

         ENDIF

      ENDIF

   END
   SetCursor( nCurs )

RETURN nArRow
// -------------------------------------------------------------

STATIC FUNCTION ABrowseBlock( aArr, nC )
RETURN ( {|x|IIf(PCount()==0, aArr[M->nArRow,nC], aArr[M->nArRow,nC]:=x)} )
// -------------------------------------------------------------

STATIC FUNCTION Skiper( nSkip, nArRow )

    LOCAL nSkiped := 0

    IF nSkip == 0
       // Show current
       nSkiped := 0

    ELSEIF nSkip > 0
       // Skip Forward
       IF nSkip < M->nArRowM - nArRow
          nSkiped := nSkip
       ELSE
          nSkiped := M->nArRowM - nArRow
       ENDIF

    ELSEIF nSkip < 0
       // Skip Backward
       IF nSkip < 1 - nArRow
          nSkiped := 1 - nArRow
       ELSE
          nSkiped := nSkip
       ENDIF

    ENDIF

    // Position at the proper element
    nArRow += nSkiped

RETURN nSkiped
// -------------------------------------------------------------

// Cursor Movement Methods
//
STATIC FUNCTION TBMoveCursor( nKey, oBrw )

   LOCAL nFound
   STATIC aKeys := ;
       { K_DOWN      , {|oB| oB:down()     },;
         K_UP        , {|oB| oB:up()       },;
         K_PGDN      , {|oB| oB:pageDown() },;
         K_PGUP      , {|oB| oB:pageUp()   },;
         K_RIGHT     , {|oB| oB:right()    },;
         K_LEFT      , {|oB| oB:left()     },;
         K_CTRL_PGUP , {|oB| oB:goTop()    },;
         K_CTRL_PGDN , {|oB| oB:goBottom() },;
         K_HOME      , {|oB| oB:home()     },;
         K_END       , {|oB| oB:end()      },;
         K_CTRL_HOME , {|oB| oB:panHome()  },;
         K_CTRL_END  , {|oB| oB:panEnd()   } }
  
   IF ( nFound := AScan( aKeys, nKey ) ) <> 0
      Eval( aKeys[ ++nFound ], oBrw )
   ENDIF

RETURN ( nFound <> 0 )
// -------------------------------------------------------------

// Edit current cell data = array element ...
//
STATIC FUNCTION DoGet( oBrw )

   local nCursSave
   local oCol, oGet, xVar
   local nKey

   if oBrw:ColPos == 1
      RETURN .F.
   endif

   xVar := xVar // To satify compiler ...
   nCursSave := SetCursor( SC_NORMAL )

   // make sure browse is stable
   oBrw:ForceStable()

   oCol := oBrw:GetColumn( oBrw:colPos )

   // create a corresponding GET and READ it
   oGet := GetNew( row(), col(), oCol:block, "xVar",, "W+/BG,W+/B" )
   ReadModal( { oGet } )

   oBrw:RefreshCurrent()
   oBrw:ForceStable()

   // check exit key
   nKey := LastKey()
   if nKey == K_UP .or. nKey == K_DOWN .or. ;
      nKey == K_PGUP .or. nKey == K_PGDN
      KEYBOARD Chr( nKey )
   endif

   SetCursor( nCursSave )

RETURN .T.
// -------------------------------------------------------------
Reply all
Reply to author
Forward
0 new messages