home *** CD-ROM | disk | FTP | other *** search
- // Tb23.prg
- //
- // Browsing Nested arrays to 2 dimensions
- //
- // Compile with /a /m /n /w /dTEST
- //
- // Link with Tbutils, Dict
-
- #include "Inkey.ch"
- #include "Tbutils.ch"
-
- #ifdef TEST
- FUNCTION Tb23
-
- LOCAL aAddr := { ;
- {"Spence", "Rick", "14 Sea Oaks Drive"}, ;
- {"Schwartz", "Phil"}, ;
- "Just an Element", ;
- {30, 70, 50} ;
- }
-
- CLEAR SCREEN
- @ 4, 9 TO 21, 71
- BrNest(5, 10, 20, 70, aAddr)
-
- RETURN NIL
- #endif
-
-
- FUNCTION BrNest(nTop, nLeft, nBottom, nRight, aVar)
-
- LOCAL oTbr := TBabrNest(aVar)
- LOCAL lExitRequested := .F.
- LOCAL nKey
-
- CLEAR SCREEN
- oTbr:nTop := 1
- oTbr:nLeft := 1
- oTbr:nBottom := MaxRow() - 1
- oTbr:nright := MaxCol() - 1
- @ 0, 0 TO MaxRow(), MaxCol()
-
- DO WHILE !lExitRequested
- FullStabilize(oTbr)
- IF !(ValType(aVar[oTbr:cargo]) == "A")
- oTbr:deHilite()
- oTbr:colPos := 1
- FullStabilize(oTbr)
- ELSEIF oTbr:colPos > Len(aVar[oTbr:cargo])
- oTbr:deHilite()
- oTbr:colPos := Len(aVar[oTbr:cargo])
- FullStabilize(oTbr)
- ENDIF
- nKey := Inkey(0)
- IF !StdMeth(nKey, oTbr)
- lExitRequested := (nKey == K_ESC)
- ENDIF
- ENDDO
-
- RETURN NIL
-
-
- FUNCTION TBabrNest(aVar)
-
- LOCAL oTbr := TBrowseNew()
- LOCAL nTBColumns := 1
- LOCAL i
- LOCAL oTbc
-
- oTbr:cargo := 1
-
- Aeval(aVar, {|aElem| ;
- nTBColumns := iif(ValType(aElem) == "A", ;
- Max(Len(aElem), nTBColumns), ;
- nTBColumns) })
-
- FOR i := 1 TO nTBColumns
- oTbc := TBColumnNew(, Anest2Blk(oTbr, aVar, i))
- oTbc:width := AnestWidth(aVar, i)
- oTbr:addColumn(oTbc)
- NEXT
-
- oTbr:goTopBlock := {|| oTbr:cargo := 1 }
- oTbr:goBottomBlock := {|| oTbr:cargo := Len(aVar) }
- oTbr:skipBlock := ARRAY_SKIPPER(oTbr:cargo, aVar)
-
- RETURN oTbr
-
-
- FUNCTION Anest2Blk(oTbr, aVar, nCol)
-
- RETURN {|| ArrayDisplay(oTbr, aVar, nCol) }
-
-
- FUNCTION ArrayDisplay(oTbr, aVar, nCol)
-
- LOCAL rVal
-
- IF !(ValType(aVar[oTbr:cargo]) == "A")
- IF nCol > 1
- rVal := ""
- ELSE
- rVal := aVar[oTbr:cargo]
- ENDIF
- ELSEIF nCol <= Len(aVar[oTbr:cargo])
- rVal := aVar[oTbr:cargo, nCol]
- ELSE
- rVal := ""
- ENDIF
-
- RETURN rVal
-
-
- FUNCTION AnestWidth(aVar, nCol)
-
- LOCAL i
- LOCAL nLen := Len(aVar)
- LOCAL nLongest := 0
- LOCAL xElem
-
- FOR i := 1 TO nLen
- IF ValType(aVar[i]) == "A"
- IF Len(aVar[i]) >= nCol
- xElem := aVar[i, nCol]
- ELSE
- xElem := ""
- ENDIF
- ELSE
- xElem := aVar[i]
- ENDIF
-
- nLongest := Max(nLongest, DataLen(xElem))
- NEXT
-
- RETURN nLongest
-
-
- FUNCTION DataLen(xElem)
-
- LOCAL nLen
- LOCAL cType := ValType(xElem)
-
- DO CASE
- CASE cType $ "ACM"
- nLen := Len(xElem)
-
- CASE cType == "N"
- nLen := Len(Str(xElem))
-
- CASE cType == "L"
- nLen := 1
-
- CASE cType == "D"
- nLen := 8
-
- CASE cType == "U" // Value NIL
- nLen := 3
- ENDCASE
-
- RETURN nLen