home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 5 / 05.iso / a / a065 / 1.img / TBPRGS.EXE / TB14.PRG < prev    next >
Encoding:
Text File  |  1992-03-04  |  4.1 KB  |  144 lines

  1.     // Tb14.prg - Demonstrate editing records during tbrowse display.
  2.     //            While and for conditions are set, and we ensure
  3.     //            the same record is highlighted after the display
  4.     //            No append mode
  5.     //
  6.     // Compile with /a /m /n /w
  7.     // Link with tbutils, tb07, dict
  8.  
  9.     #include "Inkey.ch"
  10.     #include "Setcurs.ch"
  11.  
  12.     MEMVAR getList
  13.  
  14.     FUNCTION Tb14
  15.  
  16.     FIELD Lname, Fname, Addr1, Addr2, Addr3, AcBal IN Tbdbf1
  17.  
  18.     LOCAL oTbr
  19.     LOCAL lExitRequested := .F.
  20.     LOCAL nKey
  21.     LOCAL nSr, nSc
  22.     LOCAL bNext
  23.     LOCAL bPrev
  24.     LOCAL bWhile, bFor
  25.     LOCAL bFirst, bLast
  26.     LOCAL aAfterKeys := { ;
  27.                           { K_ENTER, {|oTbr| FldEdit(oTbr, bWhile, bFor) }} ;
  28.                         }
  29.  
  30.       bFirst := {|| Dbseek("SPENCE") }
  31.       bLast  := {|| Dbseek("SPENCF", .T.), Dbskip(-1) }
  32.       bFor   := {|| AcBal > 0 }
  33.       bWhile := {|| Upper(Lname) = "SPENCE" }
  34.  
  35.       set(_SET_SCOREBOARD, .F.)
  36.       set(_SET_CURSOR,     SC_NONE)
  37.  
  38.       USE Tbdbf1
  39.       IF !file("Tbdbf1.ntx")
  40.         INDEX ON upper(Lname + Fname) TO Tbdbf1
  41.       ELSE
  42.         SET INDEX TO Tbdbf1
  43.       ENDIF
  44.     
  45.       CLEAR SCREEN
  46.       @ 0, 0 TO 23, 79
  47.  
  48.       oTbr := TBrowseNew(1, 1, MaxRow() - 1, MaxCol() - 1)
  49.       AddAllFields(oTbr)
  50.  
  51.       oTbr:insColumn(1, tbColumnNew("Rec #", {|| Recno() }))
  52.       oTbr:freeze := 1
  53.  
  54.       oTbr:goTopBlock    := {||  tbFwFirst(bFirst, bWhile, bFor) }
  55.       oTbr:goBottomBlock := {||  tbFwLast(bLast, bWhile, bFor) }
  56.  
  57.       bNext := {|| TBFwGoNext(bFor, bWhile) }
  58.       bPrev := {|| TBFwGoPrev(bFor, bWhile) }
  59.  
  60.       oTbr:skipBlock := {|n| DbSkipBlock(n, bNext, bPrev) }
  61.       CLEAR SCREEN
  62.       @ 0, 0 TO MaxRow(), MaxCol()
  63.       oTbr:goTop()
  64.       IF !Eval(bWhile)
  65.         Alert("No matching records", {"OK"})
  66.       ELSE
  67.         MyBrowse2(oTbr,, aAfterKeys)
  68.       ENDIF
  69.  
  70.     RETURN NIL
  71.  
  72.     #define MEMO_TOP    10
  73.     #define MEMO_LEFT   20
  74.     #define MEMO_BOTTOM 20
  75.     #define MEMO_RIGHT  60
  76.  
  77.     FUNCTION FldEdit(oTbr, bWhile, bFor)
  78.  
  79.     LOCAL bFldGsb, cFval, cOldkey, lSaveCurs, cNewKey
  80.     LOCAL nOldRecNo, cNewKeyVal, cOldKeyVal
  81.     LOCAL cSaveScr, lMemoUpdated := .F.
  82.  
  83.       // We must save old index key val to see whether
  84.       // it changed after the edit
  85.       cOldKeyVal := &(IndexKey())
  86.   
  87.       lSaveCurs := set(_SET_CURSOR, SC_NORMAL)
  88.  
  89.       // tbColumn's block instance var is a get / set block for the
  90.       // field, or for memo fields, the code block returns "memo" if
  91.       // evaluated, a get / set block for the memo field if evaluated
  92.       // with a parameter
  93.       bFldGsb := oTbr:getColumn(oTbr:colPos):block
  94.  
  95.       // Get its contents
  96.       cFval := Eval(bFldGsb)
  97.  
  98.       // Note short-circuit here ...
  99.       IF ValType(cFval) == "C" .AND. cFval == "Memo"
  100.         // Evaluating bFldGsb with ANY parameter returns a get / set
  101.         // block for memos
  102.         bFldGsb := Eval(bFldGsb, .T.)
  103.         cSaveScr := SaveScreen(MEMO_TOP, MEMO_LEFT, ;
  104.                                MEMO_BOTTOM, MEMO_RIGHT)
  105.         @ MEMO_TOP, MEMO_LEFT TO ;
  106.           MEMO_BOTTOM, MEMO_RIGHT
  107.         cFval := MemoEdit(eval(bFldGsb), ;
  108.                           MEMO_TOP + 1, MEMO_LEFT + 1, ;
  109.                           MEMO_BOTTOM - 1, MEMO_RIGHT - 1)
  110.         lMemoUpdated := LastKey() == K_CTRL_W
  111.         RestScreen(MEMO_TOP, MEMO_LEFT, MEMO_BOTTOM, ;
  112.                    MEMO_RIGHT, cSaveScr)
  113.       ELSE
  114.         @ Row(), Col() GET cFval
  115.         READ
  116.       ENDIF
  117.  
  118.       Set(_SET_CURSOR, lSaveCurs)
  119.  
  120.       IF Updated() .OR. lMemoUpdated
  121.         DO WHILE !Rlock()
  122.         ENDDO
  123.  
  124.         // Update the field
  125.         Eval(bFldGsb, cFval)
  126.         UNLOCK
  127.  
  128.         IF !Eval(bWhile) .OR. !Eval(bFor)
  129.           oTbr:goTop()
  130.         ELSE
  131.           // Get new key value - If you already have a code block
  132.           // on the current index key, simply eval it here instead
  133.           cNewKeyVal := &(IndexKey())
  134.           // If the key changed, refreshAll()
  135.           IF cOldKeyVal != cNewKeyVal
  136.             DbStabilize(oTbr)
  137.           ELSE
  138.             oTbr:refreshcurrent()
  139.           ENDIF
  140.         ENDIF
  141.       ENDIF
  142.  
  143.     RETURN .F.
  144.