home *** CD-ROM | disk | FTP | other *** search
- // Tb14.prg - Demonstrate editing records during tbrowse display.
- // While and for conditions are set, and we ensure
- // the same record is highlighted after the display
- // No append mode
- //
- // Compile with /a /m /n /w
- // Link with tbutils, tb07, dict
-
- #include "Inkey.ch"
- #include "Setcurs.ch"
-
- MEMVAR getList
-
- FUNCTION Tb14
-
- FIELD Lname, Fname, Addr1, Addr2, Addr3, AcBal IN Tbdbf1
-
- LOCAL oTbr
- LOCAL lExitRequested := .F.
- LOCAL nKey
- LOCAL nSr, nSc
- LOCAL bNext
- LOCAL bPrev
- LOCAL bWhile, bFor
- LOCAL bFirst, bLast
- LOCAL aAfterKeys := { ;
- { K_ENTER, {|oTbr| FldEdit(oTbr, bWhile, bFor) }} ;
- }
-
- bFirst := {|| Dbseek("SPENCE") }
- bLast := {|| Dbseek("SPENCF", .T.), Dbskip(-1) }
- bFor := {|| AcBal > 0 }
- bWhile := {|| Upper(Lname) = "SPENCE" }
-
- set(_SET_SCOREBOARD, .F.)
- set(_SET_CURSOR, SC_NONE)
-
- USE Tbdbf1
- IF !file("Tbdbf1.ntx")
- INDEX ON upper(Lname + Fname) TO Tbdbf1
- ELSE
- SET INDEX TO Tbdbf1
- ENDIF
-
- CLEAR SCREEN
- @ 0, 0 TO 23, 79
-
- oTbr := TBrowseNew(1, 1, MaxRow() - 1, MaxCol() - 1)
- AddAllFields(oTbr)
-
- oTbr:insColumn(1, tbColumnNew("Rec #", {|| Recno() }))
- oTbr:freeze := 1
-
- oTbr:goTopBlock := {|| tbFwFirst(bFirst, bWhile, bFor) }
- oTbr:goBottomBlock := {|| tbFwLast(bLast, bWhile, bFor) }
-
- bNext := {|| TBFwGoNext(bFor, bWhile) }
- bPrev := {|| TBFwGoPrev(bFor, bWhile) }
-
- oTbr:skipBlock := {|n| DbSkipBlock(n, bNext, bPrev) }
- CLEAR SCREEN
- @ 0, 0 TO MaxRow(), MaxCol()
- oTbr:goTop()
- IF !Eval(bWhile)
- Alert("No matching records", {"OK"})
- ELSE
- MyBrowse2(oTbr,, aAfterKeys)
- ENDIF
-
- RETURN NIL
-
- #define MEMO_TOP 10
- #define MEMO_LEFT 20
- #define MEMO_BOTTOM 20
- #define MEMO_RIGHT 60
-
- FUNCTION FldEdit(oTbr, bWhile, bFor)
-
- LOCAL bFldGsb, cFval, cOldkey, lSaveCurs, cNewKey
- LOCAL nOldRecNo, cNewKeyVal, cOldKeyVal
- LOCAL cSaveScr, lMemoUpdated := .F.
-
- // We must save old index key val to see whether
- // it changed after the edit
- cOldKeyVal := &(IndexKey())
-
- lSaveCurs := set(_SET_CURSOR, SC_NORMAL)
-
- // tbColumn's block instance var is a get / set block for the
- // field, or for memo fields, the code block returns "memo" if
- // evaluated, a get / set block for the memo field if evaluated
- // with a parameter
- bFldGsb := oTbr:getColumn(oTbr:colPos):block
-
- // Get its contents
- cFval := Eval(bFldGsb)
-
- // Note short-circuit here ...
- IF ValType(cFval) == "C" .AND. cFval == "Memo"
- // Evaluating bFldGsb with ANY parameter returns a get / set
- // block for memos
- bFldGsb := Eval(bFldGsb, .T.)
- cSaveScr := SaveScreen(MEMO_TOP, MEMO_LEFT, ;
- MEMO_BOTTOM, MEMO_RIGHT)
- @ MEMO_TOP, MEMO_LEFT TO ;
- MEMO_BOTTOM, MEMO_RIGHT
- cFval := MemoEdit(eval(bFldGsb), ;
- MEMO_TOP + 1, MEMO_LEFT + 1, ;
- MEMO_BOTTOM - 1, MEMO_RIGHT - 1)
- lMemoUpdated := LastKey() == K_CTRL_W
- RestScreen(MEMO_TOP, MEMO_LEFT, MEMO_BOTTOM, ;
- MEMO_RIGHT, cSaveScr)
- ELSE
- @ Row(), Col() GET cFval
- READ
- ENDIF
-
- Set(_SET_CURSOR, lSaveCurs)
-
- IF Updated() .OR. lMemoUpdated
- DO WHILE !Rlock()
- ENDDO
-
- // Update the field
- Eval(bFldGsb, cFval)
- UNLOCK
-
- IF !Eval(bWhile) .OR. !Eval(bFor)
- oTbr:goTop()
- ELSE
- // Get new key value - If you already have a code block
- // on the current index key, simply eval it here instead
- cNewKeyVal := &(IndexKey())
- // If the key changed, refreshAll()
- IF cOldKeyVal != cNewKeyVal
- DbStabilize(oTbr)
- ELSE
- oTbr:refreshcurrent()
- ENDIF
- ENDIF
- ENDIF
-
- RETURN .F.