home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 5 / 05.iso / a / a054 / 1.img / GETLIB.EXE / DATADRIV.PRG next >
Encoding:
Text File  |  1992-03-09  |  2.6 KB  |  120 lines

  1. // Datadriv.prg
  2. //
  3. // Data driven routines
  4. //
  5. // BuildScreen(), ReadScren(), GetFldRefresh()
  6.  
  7. #include "Inkey.ch"
  8.  
  9. #define GC_SAY_ROW    1
  10. #define GC_SAY_COL    2
  11. #define GC_SAY_TEXT   3
  12. #define GC_SAY_PICT   4
  13. #define GC_SAY_COLOR  5
  14. #define GC_FLD_GSB    6
  15. #define GC_FLD_VALUE  7
  16.  
  17. FUNCTION BuildScreen(cScrName)
  18.  
  19. FIELD ScrName, SayRow, SayCol, SayString, ;
  20.       SayPict, SayColor IN Screens
  21.  
  22. FIELD GetRow,  GetCol, GetFld, GetPict, ;
  23.       GetWhen, GetValid, GetColor IN Screens
  24.  
  25. LOCAL nGets  := 0
  26. LOCAL i
  27. LOCAL aGets := {}
  28. LOCAL oGet
  29.  
  30.   Screens -> (DbSeek(cScrName))
  31.   DO WHILE cScrName == Trim(Upper(Screens -> ScrName))
  32.     nGets++
  33.     Aadd(aGets, GetNew())
  34.     oGet := aGets[nGets]
  35.     IF Empty(SayColor)
  36.       oGet:cargo := {SayRow, SayCol, Trim(SayString), ;
  37.                      Trim(SayPict), NIL, NIL, NIL}
  38.     ELSE
  39.       oGet:cargo := {SayRow, SayCol, Trim(SayString), ;
  40.                      Trim(SayPict), Trim(SayColor), NIL, NIL}
  41.     ENDIF
  42.  
  43.     IF Empty(GetFld)
  44.       oGet:preBlock := {|| .F. }
  45.     ELSE
  46.       oGet:cargo[GC_FLD_GSB]   := FieldBlock(GetFld)
  47.       oGet:cargo[GC_FLD_VALUE] := Eval(oGet:cargo[GC_FLD_GSB])
  48.       oGet:block    := Oblk(oGet)
  49.       oGet:row      := GetRow
  50.       oGet:col      := GetCol
  51.       oGet:picture  := Trim(GetPict)
  52.  
  53.       IF !Empty(GetColor)
  54.         oGet:colorSpec := GetColor
  55.       ENDIF
  56.  
  57.       IF !Empty(GetWhen)
  58.         oGet:preBlock := &GetWhen
  59.       ENDIF
  60.  
  61.       IF !Empty(GetValid)
  62.         oGet:postBlock := &GetValid
  63.       ENDIF
  64.     ENDIF
  65.  
  66.     Screens -> (DbSkip(1))
  67.   ENDDO
  68.  
  69. RETURN aGets
  70.  
  71.  
  72. FUNCTION ReadScreen(aScreen)
  73.  
  74. LOCAL i
  75. LOCAL oGet
  76. LOCAL nGets := Len(aScreen)
  77.  
  78.   CLEAR SCREEN
  79.   FOR i := 1 TO nGets
  80.     oGet := aScreen[i]
  81.     DevPos(oGet:cargo[GC_SAY_ROW], oGet:cargo[GC_SAY_COL])
  82.     DevOutPict(oGet:cargo[GC_SAY_TEXT],  ;
  83.                oGet:cargo[GC_SAY_PICT], ;
  84.                oGet:cargo[GC_SAY_COLOR])
  85.     IF oGet:block != NIL
  86.       oGet:display()
  87.     ENDIF
  88.   NEXT
  89.  
  90.   ReadModal(aScreen)
  91.   IF LastKey() != K_ESC .AND. Updated()
  92.     IF Rlock()
  93.       FOR i := 1 TO nGets
  94.         oGet := aScreen[i]
  95.         IF oGet:block != NIL
  96.           Eval(oGet:cargo[GC_FLD_GSB], oGet:cargo[GC_FLD_VALUE])
  97.     ENDIF
  98.       NEXT
  99.       UNLOCK
  100.     ENDIF
  101.   ENDIF
  102.  
  103. RETURN NIL
  104.  
  105. FUNCTION Oblk(oGet)
  106.  
  107. RETURN {|x| iif(x == NIL, oGet:cargo[GC_FLD_VALUE], ;
  108.                           oGet:cargo[GC_FLD_VALUE] := x) }
  109.  
  110.  
  111. FUNCTION GetFldRefresh(aGets)
  112.  
  113.   Aeval(aGets, ;
  114.        {|oGet| iif(oGet:block != NIL,  ;
  115.                oGet:cargo[GC_FLD_VALUE] := Eval(oGet:cargo[GC_FLD_GSB]), ;
  116.                NIL)})
  117.  
  118. RETURN NIL
  119.  
  120.