home *** CD-ROM | disk | FTP | other *** search
/ C!T ROM 2 / ctrom_ii_b.zip / ctrom_ii_b / PROGRAM / FOXPRO / TABLES / TBLSRC / TABLE2.PRG < prev    next >
Text File  |  1992-11-12  |  8KB  |  289 lines

  1. * Program   :table.prg
  2. * Author    :Mark D. Miller
  3. * Date      :03-Aug-1992
  4. * Notice    : Copyright (c) 03-Aug-1992 by Mark D. Miller
  5. *             All Rights Reserved.
  6. * Notes     :See if I can implement table fields as TAB fields w/o
  7. *            displaying the pick lists.
  8.  
  9. #INCLUDE IO.HDR
  10. #INCLUDE KEYS.HDR
  11. #INCLUDE FILEIO.HDR
  12. #INCLUDE STRING.HDR
  13. #INCLUDE PICK.HDR
  14. #INCLUDE WARN.HDR
  15.  
  16. *
  17. * Global Table Memory
  18. *
  19. VARDEF
  20.     CHAR( 12 )  OpenTableName
  21.     FILE        OpenTableHandle
  22.     UINT        TableCnt, TableCnt2, TableKy
  23.     LONG        DataList, KeyList
  24.     INT         TableType
  25.     INT         TableIdx
  26.     *
  27.     * The following variable should NOT be copied to other programs!
  28.     *   IT IS FOR TESTING ONLY!
  29.     *
  30.     CHAR( 1 )   SEX
  31. ENDDEF
  32.  
  33. * Procedure :ClearTable
  34. * Date      :11-Nov-1992
  35. * Parameters:(none)
  36. *           :
  37. *           :
  38. * Notes     :Clear the currently open table from memory
  39. *
  40. PROCEDURE ClearTable
  41.     PICK_CLEAR( DataList )
  42.     IF TableType = 2
  43.         PICK_CLEAR( KeyList )
  44.     ENDIF
  45.     OpenTableName = SPACE( 12 )
  46. ENDPRO
  47.  
  48. * Function  :InitTable
  49. * Date      :11-Nov-1992
  50. * Parameters:Name           Name of the table file to initialize
  51. *           :
  52. * Return Val:.T.            Initialization successfull
  53. *           :.F.            Initialization failed
  54. * Notes     :This routine opens and reads the specified table file into
  55. *            pick lists for field processing.
  56. *
  57. FUNCTION LOGICAL InitTable
  58.     PARAMETERS  VALUE CHAR( 8 ) name
  59.  
  60.     VARDEF
  61.         CHAR        TableIn
  62.     ENDDEF
  63.     *
  64.     * Create Pick list to show entries in.
  65.     *
  66.     OpenTableName = TRIM( name )+".tbl"
  67.     IF .NOT. F_OPEN( OpenTableHandle, OpenTableName, &F_READ )
  68.         ?"IninTable:Fatal Error: can't find table!"+OpenTableName
  69.         RETURN .F.
  70.     ENDIF
  71.  
  72.     *
  73.     * Bypass first line which is comment line (get table type)
  74.     *
  75.     DataList = PICK_INIT()
  76.     F_GETLN( OpenTableHandle, TableIn )
  77.     TableType = VAL( TableIn )
  78.     IF TableType = 0 .OR. TableType > 2
  79.         TableType = 1                   && Numerical table
  80.     ENDIF
  81.  
  82.     IF TableType = 2                    && Keyed table
  83.         KeyList = PICK_INIT()
  84.     ENDIF
  85.  
  86.     *
  87.     * Load the table entries in the pick list
  88.     *
  89.     TableCnt = 0
  90.     DO WHILE .NOT. F_EOF( OpenTableHandle )
  91.         F_GETLN( OpenTableHandle, TableIn )
  92.         IF TableType = 2
  93.             PICK_ADD( KeyList, LEFT( TableIn, AT( "-", TableIn )-1 ) )
  94.             PICK_ADD( DataList, SUBSTR( TableIn, AT( "-", TableIn )+1, LEN( TableIn ) ) )
  95.         ELSE
  96.             PICK_ADD( DataList, TableIn )
  97.         ENDIF
  98.  
  99.         TableCnt = TableCnt + 1
  100.     ENDDO
  101.  
  102.     F_CLOSE( OpenTableHandle )
  103.     RETURN .T.
  104. ENDPRO
  105.  
  106. * Function  :VerifyTable
  107. * Date      :11-Nov-1992
  108. * Parameters:Name           Name of the table
  109. *           :row            Row field is on
  110. *           :col            Column to begin printing
  111. *           :length         Max length of print area
  112. *           :pkey           Current field value
  113. *           :
  114. * Return Val:.T.            If entry found in table
  115. *            .F.            If entry not found in table
  116. * Notes     :This is the heart of the table routines.  This routine looks
  117. *            up the current field value in the table and/or reacts to the
  118. *            tab key and several cursor movement keys.
  119. *
  120. FUNCTION LOGICAL VerifyTable
  121.     PARAMETERS VALUE    CHAR( 8 )   name,;
  122.                VALUE    UINT        ROW,;
  123.                VALUE    UINT        COL,;
  124.                VALUE    INT         length,;
  125.                VALUE    CHAR( 4 )   pkey
  126.  
  127.     VARDEF
  128.         CHAR        TableIn
  129.         LOGICAL     fnd
  130.         CHAR( 4 )   pkey2, mykey
  131.         INT         L
  132.     ENDDEF
  133.  
  134.     *
  135.     * Init the table if not already
  136.     *
  137.     IF AT( Name, OpenTableName ) = 0
  138.         IF .NOT. InitTable( Name )
  139.             RETURN .T.
  140.         ENDIF
  141.     ENDIF
  142.  
  143.     pkey2=TRIM( pkey )
  144.     IF TableKy <> &K_TAB
  145.         IF pkey2=""
  146.             @ ROW, COL CLEAR TO ROW, COL+length
  147.             IF TableKy = &K_ENTER .OR. TableKy = &K_ESC .OR. TableKy = &K_C_END .OR. ( TableKy > &K_HOME .AND. TableKy < &K_INS )
  148.                 ClearTable()
  149.             ENDIF
  150.             RETURN .T.                  && Always allow to skip field
  151.         ENDIF
  152.     ENDIF
  153.     *
  154.     * Validate the choice against the list
  155.     *
  156.     IF TableType = 1
  157.         IF TableKy = &K_TAB
  158.             IF TableIdx+1 > TableCnt
  159.                 TableIdx = 1
  160.             ELSE
  161.                 TableIdx = TableIdx + 1
  162.             ENDIF
  163.             @ ROW, COL CLEAR TO ROW, COL+length
  164.             @ ROW, COL ?? PICK_STR( DataList, TableIdx )
  165.             KEY_INT( &K_HOME )
  166.             KEY_INT( &K_DEL )
  167.             KEY_INT( &K_DEL )
  168.             KEY_INT( &K_DEL )
  169.             KEY_INT( &K_DEL )
  170.             pkey = I_STR( TableIdx )
  171.             KEYBOARD( pkey )
  172.             fnd = .T.
  173.         ELSE
  174.             IF I_VAL( pkey2 )=0
  175.                 fnd=.F.
  176.             ELSE
  177.                 IF I_VAL( pkey2 ) > TableCnt
  178.                     fnd= .F.
  179.                 ELSE
  180.                     @ ROW, COL CLEAR TO ROW, COL+length
  181.                     @ ROW, COL ?? PICK_STR( DataList, I_VAL( pkey2 ) )
  182.                     TableIdx = I_VAL( pkey2 )
  183.                     fnd = .T.
  184.                 ENDIF
  185.             ENDIF
  186.         ENDIF
  187.     ELSE
  188.         IF TableKy = &K_TAB
  189.             IF TableIdx+1 > TableCnt
  190.                 TableIdx = 1
  191.             ELSE
  192.                 TableIdx = TableIdx + 1
  193.             ENDIF
  194.             pkey = PICK_STR( KeyList, TableIdx )
  195.             @ ROW, COL CLEAR TO ROW, COL+length
  196.             @ROW, COL ?? PICK_STR( DataList, TableIdx )
  197.             KEY_INT( &K_HOME )
  198.             KEY_INT( &K_DEL )
  199.             KEY_INT( &K_DEL )
  200.             KEY_INT( &K_DEL )
  201.             KEY_INT( &K_DEL )
  202.             KEYBOARD( pkey )
  203.             fnd = .T.
  204.         ELSE
  205.             TableCnt2 = 1
  206.             fnd = .F.
  207.             DO WHILE TableCnt2 < TableCnt+1 .AND. .NOT. fnd
  208.                 mykey = PICK_STR( KeyList, TableCnt2 )
  209.                 L = LEN( mykey )
  210.                 IF LEFT( pkey2, L ) = mykey
  211.                     fnd = .T.
  212.                     @ ROW, COL CLEAR TO ROW, COL+length
  213.                     @ROW, COL ?? PICK_STR( DataList, TableCnt2 )
  214.                     TableIdx = TableCnt2
  215.                 ENDIF
  216.  
  217.                 TableCnt2 = TableCnt2 + 1
  218.             ENDDO
  219.         ENDIF
  220.     ENDIF
  221.  
  222.     IF .NOT. fnd
  223.         @ 23, 1
  224.         WAIT CHR( 7 )+"Table error!!! Press TAB for choices!"
  225.     ELSE
  226.         IF TableKy = &K_ENTER .OR. TableKy = &K_ESC .OR. TableKy = &K_C_END .OR. ( TableKy > &K_HOME .AND. TableKy < &K_INS )
  227.             ClearTable()
  228.         ENDIF
  229.     ENDIF
  230.  
  231.     RETURN fnd
  232. ENDPRO
  233.  
  234. * Function  :Table
  235. * Date      :03-Aug-1992
  236. * Parameters:name           Name of table
  237. *           :row            Row field is on
  238. *           :col            Col field is on
  239. *           :length         Max Length of table strings
  240. *           :pkey           Key into PickList
  241. *           :
  242. * Return Val:TableKy        Key pressed
  243. *           :
  244. * Notes     :This routine opens the correct table file and calls VerifyTable
  245. *
  246. FUNCTION UINT Table
  247.     PARAMETERS  CONST   CHAR( 8 )   name,;
  248.                 VALUE   UINT        ROW,;
  249.                 VALUE   UINT        COL,;
  250.                 VALUE   INT         length,;
  251.                         CHAR( 4 )   pkey
  252.  
  253.     TableKy = LASTKEY()
  254.     IF TableKy <> &K_TAB
  255.         RETURN TableKy
  256.     ENDIF
  257.     *
  258.     * Init the table if not already
  259.     *
  260.     IF AT( Name, OpenTableName ) = 0
  261.         IF .NOT. InitTable( Name )
  262.             RETURN 0
  263.         ENDIF
  264.     ENDIF
  265.     VerifyTable( "SEXCODES", ROW, COL, length, SEX )
  266.     RETURN &K_HOME
  267. ENDPRO
  268.  
  269. PROCEDURE FORCE_MAIN
  270.  
  271.     VARDEF
  272.         CHAR( 10 )    fname
  273.         INT         age
  274.     ENDDEF
  275.  
  276.     SET CONFIRM ON
  277.     CLEAR
  278.  
  279.     @ 1, 1 SAY "First Name    : " GET fname
  280.     @ 3, 1 SAY "table value   : " ;
  281.            GET SEX PICTURE "!!"    ;
  282.            FILTER Table( "SEXCODES", 3, 21, 6, SEX ) ;
  283.            VALID VerifyTable( "SEXCODES", 3, 21, 6, SEX )
  284.  
  285.     @ 5, 1 SAY "Your Age      : " GET age PICTURE "999"
  286.     READ
  287.  
  288. ENDPRO
  289.