home *** CD-ROM | disk | FTP | other *** search
- // Tb30.prg
-
- // Program sequence illustrating how to browse a record
- // on more than one line. Generic version, moves and highlights
- // entire multi-line records
-
- #include "Inkey.ch"
- #include "Tbutils.ch"
-
- FUNCTION Tb30
-
- FIELD Lname, Fname, Addr1, Addr2, Addr3, Addr4, State, Zip IN TbDbf1
-
- LOCAL oTbr
- LOCAL oTbc
- LOCAL nRowNum := 1 // Index into the fields array
- LOCAL i
- LOCAL bNext
- LOCAL bPrev
- LOCAL aFields := { ;
- {|| Lname + " " + Fname }, ;
- {|| Addr1 }, ;
- {|| Addr2 }, ;
- {|| Addr3 }, ;
- {|| Addr4 }, ;
- {|| Trim(State) + " " + Zip } ;
- }
-
- LOCAL lExitRequested
- LOCAL nKey
- LOCAL nVisRows
-
- USE TbDbf1
- IF !file("TbDbf1.ntx")
- INDEX ON Upper(Lname) TO TbDbf1
- ELSE
- SET INDEX TO TbDbf1
- ENDIF
-
- CLEAR SCREEN
- @ 0, 0 TO 23, 79
-
- oTbr := TBrowseNew(1, 1, 22, 78)
- oTbr:colSep := DEF_CSEP
- oTbr:footSep := DEF_FSEP
- oTbr:headSep := DEF_HSEP
-
- oTbc := TBColumnNew(, {|| Eval(aFields[nRowNum]) } )
- oTbr:addColumn(oTbc)
-
- oTbr:goTopBlock := {| | DbGoTop(), nRowNum := 1 }
- oTbr:goBottomBlock := {| | DbGoBottom(), nRowNum := Len(aFields) }
- bNext := {|| GoNext(@nRowNum, aFields) }
- bPrev := {|| GoPrev(@nRowNum, aFields) }
- oTbr:skipBlock = {|n| DbSkipBlock(n, bNext, bPrev) }
-
- lExitRequested := .F.
- DO WHILE !lExitRequested
- FullStabilize(oTbr)
- DO WHILE nRowNum != 1
- oTbr:up()
- FullStabilize(oTbr)
- ENDDO
-
- // This ensures the entire record is always displayed
- // Figure out how many visible rows ... may be at bottom of
- // display
- nVisRows := Min(oTbr:rowCount - oTbr:rowPos + 1, Len(aFields))
- IF nVisRows < Len(aFields)
- DO WHILE nRowNum != Len(aFields)
- oTbr:down()
- FullStabilize(oTbr)
- ENDDO
-
- // Now back to line 1
- DO WHILE nRowNum != 1
- oTbr:up()
- FullStabilize(oTbr)
- ENDDO
-
- ENDIF
-
- oTbr:colorRect({ oTbr:rowPos, oTbr:leftVisible, ;
- oTbr:rowPos + Len(aFields) - 1, oTbr:rightVisible }, ;
- {2, 1})
-
- nKey := Inkey(0)
-
- // dehilite entire row before continuing
- oTbr:colorRect({ oTbr:rowPos, oTbr:leftVisible, ;
- oTbr:rowPos + Len(aFields) - 1, oTbr:rightVisible }, ;
- {1, 2})
-
- IF nKey == K_DOWN
- FOR i := 1 TO Len(aFields)
- oTbr:down()
- NEXT
- ELSEIF !StdMeth(nKey, oTbr)
- DO CASE
- CASE nKey == K_ESC
- lExitRequested := .T.
- ENDCASE
- ENDIF
- ENDDO
-
- RETURN NIL
-
-
- FUNCTION GoNext(nRowNum, aFields)
-
- LOCAL lMoved := .T.
-
- IF Eof() .OR. LastRec() == 0
- lMoved := .F.
- ELSE
- IF nRowNum < Len(aFields)
- nRowNum++
- ELSE
- SKIP
- IF !Eof()
- nRowNum := 1
- ELSE
- SKIP -1
- lMoved := .F.
- ENDIF
- ENDIF
- ENDIF
-
- RETURN lMoved
-
-
- FUNCTION GoPrev(nRowNum, aFields)
-
- LOCAL lMoved := .T.
-
- IF Bof() .OR. LastRec() == 0
- lMoved := .F.
- ELSE
- IF nRowNum > 1
- nRowNum--
- ELSE
- SKIP -1
- IF !Bof()
- nRowNum := Len(aFields)
- ELSE
- lMoved := .F.
- ENDIF
- ENDIF
- ENDIF
-
- RETURN lMoved