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 >
Wrap
Text File
|
1992-11-12
|
8KB
|
289 lines
* Program :table.prg
* Author :Mark D. Miller
* Date :03-Aug-1992
* Notice : Copyright (c) 03-Aug-1992 by Mark D. Miller
* All Rights Reserved.
* Notes :See if I can implement table fields as TAB fields w/o
* displaying the pick lists.
#INCLUDE IO.HDR
#INCLUDE KEYS.HDR
#INCLUDE FILEIO.HDR
#INCLUDE STRING.HDR
#INCLUDE PICK.HDR
#INCLUDE WARN.HDR
*
* Global Table Memory
*
VARDEF
CHAR( 12 ) OpenTableName
FILE OpenTableHandle
UINT TableCnt, TableCnt2, TableKy
LONG DataList, KeyList
INT TableType
INT TableIdx
*
* The following variable should NOT be copied to other programs!
* IT IS FOR TESTING ONLY!
*
CHAR( 1 ) SEX
ENDDEF
* Procedure :ClearTable
* Date :11-Nov-1992
* Parameters:(none)
* :
* :
* Notes :Clear the currently open table from memory
*
PROCEDURE ClearTable
PICK_CLEAR( DataList )
IF TableType = 2
PICK_CLEAR( KeyList )
ENDIF
OpenTableName = SPACE( 12 )
ENDPRO
* Function :InitTable
* Date :11-Nov-1992
* Parameters:Name Name of the table file to initialize
* :
* Return Val:.T. Initialization successfull
* :.F. Initialization failed
* Notes :This routine opens and reads the specified table file into
* pick lists for field processing.
*
FUNCTION LOGICAL InitTable
PARAMETERS VALUE CHAR( 8 ) name
VARDEF
CHAR TableIn
ENDDEF
*
* Create Pick list to show entries in.
*
OpenTableName = TRIM( name )+".tbl"
IF .NOT. F_OPEN( OpenTableHandle, OpenTableName, &F_READ )
?"IninTable:Fatal Error: can't find table!"+OpenTableName
RETURN .F.
ENDIF
*
* Bypass first line which is comment line (get table type)
*
DataList = PICK_INIT()
F_GETLN( OpenTableHandle, TableIn )
TableType = VAL( TableIn )
IF TableType = 0 .OR. TableType > 2
TableType = 1 && Numerical table
ENDIF
IF TableType = 2 && Keyed table
KeyList = PICK_INIT()
ENDIF
*
* Load the table entries in the pick list
*
TableCnt = 0
DO WHILE .NOT. F_EOF( OpenTableHandle )
F_GETLN( OpenTableHandle, TableIn )
IF TableType = 2
PICK_ADD( KeyList, LEFT( TableIn, AT( "-", TableIn )-1 ) )
PICK_ADD( DataList, SUBSTR( TableIn, AT( "-", TableIn )+1, LEN( TableIn ) ) )
ELSE
PICK_ADD( DataList, TableIn )
ENDIF
TableCnt = TableCnt + 1
ENDDO
F_CLOSE( OpenTableHandle )
RETURN .T.
ENDPRO
* Function :VerifyTable
* Date :11-Nov-1992
* Parameters:Name Name of the table
* :row Row field is on
* :col Column to begin printing
* :length Max length of print area
* :pkey Current field value
* :
* Return Val:.T. If entry found in table
* .F. If entry not found in table
* Notes :This is the heart of the table routines. This routine looks
* up the current field value in the table and/or reacts to the
* tab key and several cursor movement keys.
*
FUNCTION LOGICAL VerifyTable
PARAMETERS VALUE CHAR( 8 ) name,;
VALUE UINT ROW,;
VALUE UINT COL,;
VALUE INT length,;
VALUE CHAR( 4 ) pkey
VARDEF
CHAR TableIn
LOGICAL fnd
CHAR( 4 ) pkey2, mykey
INT L
ENDDEF
*
* Init the table if not already
*
IF AT( Name, OpenTableName ) = 0
IF .NOT. InitTable( Name )
RETURN .T.
ENDIF
ENDIF
pkey2=TRIM( pkey )
IF TableKy <> &K_TAB
IF pkey2=""
@ ROW, COL CLEAR TO ROW, COL+length
IF TableKy = &K_ENTER .OR. TableKy = &K_ESC .OR. TableKy = &K_C_END .OR. ( TableKy > &K_HOME .AND. TableKy < &K_INS )
ClearTable()
ENDIF
RETURN .T. && Always allow to skip field
ENDIF
ENDIF
*
* Validate the choice against the list
*
IF TableType = 1
IF TableKy = &K_TAB
IF TableIdx+1 > TableCnt
TableIdx = 1
ELSE
TableIdx = TableIdx + 1
ENDIF
@ ROW, COL CLEAR TO ROW, COL+length
@ ROW, COL ?? PICK_STR( DataList, TableIdx )
KEY_INT( &K_HOME )
KEY_INT( &K_DEL )
KEY_INT( &K_DEL )
KEY_INT( &K_DEL )
KEY_INT( &K_DEL )
pkey = I_STR( TableIdx )
KEYBOARD( pkey )
fnd = .T.
ELSE
IF I_VAL( pkey2 )=0
fnd=.F.
ELSE
IF I_VAL( pkey2 ) > TableCnt
fnd= .F.
ELSE
@ ROW, COL CLEAR TO ROW, COL+length
@ ROW, COL ?? PICK_STR( DataList, I_VAL( pkey2 ) )
TableIdx = I_VAL( pkey2 )
fnd = .T.
ENDIF
ENDIF
ENDIF
ELSE
IF TableKy = &K_TAB
IF TableIdx+1 > TableCnt
TableIdx = 1
ELSE
TableIdx = TableIdx + 1
ENDIF
pkey = PICK_STR( KeyList, TableIdx )
@ ROW, COL CLEAR TO ROW, COL+length
@ROW, COL ?? PICK_STR( DataList, TableIdx )
KEY_INT( &K_HOME )
KEY_INT( &K_DEL )
KEY_INT( &K_DEL )
KEY_INT( &K_DEL )
KEY_INT( &K_DEL )
KEYBOARD( pkey )
fnd = .T.
ELSE
TableCnt2 = 1
fnd = .F.
DO WHILE TableCnt2 < TableCnt+1 .AND. .NOT. fnd
mykey = PICK_STR( KeyList, TableCnt2 )
L = LEN( mykey )
IF LEFT( pkey2, L ) = mykey
fnd = .T.
@ ROW, COL CLEAR TO ROW, COL+length
@ROW, COL ?? PICK_STR( DataList, TableCnt2 )
TableIdx = TableCnt2
ENDIF
TableCnt2 = TableCnt2 + 1
ENDDO
ENDIF
ENDIF
IF .NOT. fnd
@ 23, 1
WAIT CHR( 7 )+"Table error!!! Press TAB for choices!"
ELSE
IF TableKy = &K_ENTER .OR. TableKy = &K_ESC .OR. TableKy = &K_C_END .OR. ( TableKy > &K_HOME .AND. TableKy < &K_INS )
ClearTable()
ENDIF
ENDIF
RETURN fnd
ENDPRO
* Function :Table
* Date :03-Aug-1992
* Parameters:name Name of table
* :row Row field is on
* :col Col field is on
* :length Max Length of table strings
* :pkey Key into PickList
* :
* Return Val:TableKy Key pressed
* :
* Notes :This routine opens the correct table file and calls VerifyTable
*
FUNCTION UINT Table
PARAMETERS CONST CHAR( 8 ) name,;
VALUE UINT ROW,;
VALUE UINT COL,;
VALUE INT length,;
CHAR( 4 ) pkey
TableKy = LASTKEY()
IF TableKy <> &K_TAB
RETURN TableKy
ENDIF
*
* Init the table if not already
*
IF AT( Name, OpenTableName ) = 0
IF .NOT. InitTable( Name )
RETURN 0
ENDIF
ENDIF
VerifyTable( "SEXCODES", ROW, COL, length, SEX )
RETURN &K_HOME
ENDPRO
PROCEDURE FORCE_MAIN
VARDEF
CHAR( 10 ) fname
INT age
ENDDEF
SET CONFIRM ON
CLEAR
@ 1, 1 SAY "First Name : " GET fname
@ 3, 1 SAY "table value : " ;
GET SEX PICTURE "!!" ;
FILTER Table( "SEXCODES", 3, 21, 6, SEX ) ;
VALID VerifyTable( "SEXCODES", 3, 21, 6, SEX )
@ 5, 1 SAY "Your Age : " GET age PICTURE "999"
READ
ENDPRO