Files
harbour-core/harbour/tests/db_brows.prg
Alexander S.Kresin 326085de71 Fixing db_brows.prg
2000-03-18 11:48:35 +00:00

895 lines
26 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//
// $Id$
//
*+臆臆臆臆臆臆臆臆臆臆臆臆臆臆臆臆臆臆臆臆臆臆臆臆臆臆臆臆臆臆臆臆臆臆
*+ Browse function
*+
*+ Written by Alexander Kresin <alex@belacy.belgorod.su>
*+
*+ Date : 30/09/1999
*+ Time : 19:20
*+
*+ Placed in the public domain
*+
*+ Source Module => DB_BROWSE.PRG
*+
*+ Functions: Function Main()
*+ Function DBFLIST()
*+ Function FLDCOUNT()
*+ Function MSFNEXT()
*+ Procedure MSFBACK()
*+ Function VIVNAMES()
*+ Function WNDVIVOD()
*+ Procedure VIVSTR()
*+ Function FLDSTR()
*+ Function InitList()
*+ Function FGOTOP()
*+ Function FGOBOT()
*+ Procedure FSKIP()
*+ Function FBOF()
*+ Function FEOF()
*+ Procedure FLMSFLD()
*+ Function Defpict()
*+ Function NUM_STR()
*+ Function readexit()
*+ Function updated()
*+
*+ Tables: USE &filename
*+
*+ Reformatted by Click! 2.00 on Sep-30-1999 at 7:17 pm
*+
*+臆臆臆臆臆臆臆臆臆臆臆臆臆臆臆臆臆臆臆臆臆臆臆臆臆臆臆臆臆臆臆臆臆臆
#include "fileio.ch"
#include "db_brows.ch"
MEMVAR mslist,x1,y1,x2,y2,title,maskey
MEMVAR kolfld, firstfld, prmsf
MEMVAR klfs, razmer, numfld, xfld, first_f, str_bar
*+臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼
*+
*+ Function Main()
*+
*+臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼
*+
FUNCTION Main( filename )
LOCAL vybkey
PRIVATE mslist[ LI_LEN ]
IF filename = Nil
? 'You should sign filename to browse in command line.'
QUIT
ENDIF
// select a
USE &filename
Initlist()
vybkey := 1
DO WHILE vybkey <> 0
vybkey := DBFLIST( 3, 1, 76, 20, filename )
DO CASE
CASE vybkey = 13 // Enter
// ...
CASE vybkey = - 2 // F3
// ...
CASE vybkey = - 4 // F5
// ...
ENDCASE
ENDDO
RETURN Nil
*+臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼
*+
*+ Function DBFLIST()
*+
*+ Called from ( sample.prg ) 1 - function main()
*+
*+臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼
*+
FUNCTION DBFLIST
LOCAL rezproc, xkey, rez, fipos, wndbuf, oldcolors, ym, xm, i
LOCAL prview, prsohr, predit, predxx
LOCAL fbar1, fbar2, vartmp, varbuf
LOCAL GetList := {}
#ifdef VER_MOUSE
PARAMETERS x1,y1,x2,y2,title,maskey,ctrl_ar
#else
PARAMETERS x1,y1,x2,y2,title,maskey
#endif
PRIVATE kolfld, firstfld, prmsf
PRIVATE klfs, razmer, numfld, xfld, first_f
IF TYPE( "str_bar" ) <> "C"
PRIVATE str_bar := "<22><1E>"
ENDIF
IF x1 > 99
x1 := x1 - 100
prsohr := .F.
ELSE
prsohr := .T.
ENDIF
IF y1 > 99
y1 := y1 - 100
prview := .T.
ELSE
prview := .F.
ENDIF
klfs := FCOUNT()
numfld := LI_MSF
IF VALTYPE( numfld ) = "N"
predxx := predit := LI_MSF
prmsf := .F.
ELSE
predxx := predit := IIF( ASCAN( LI_MSF, 3 ) <> 0, 3, IIF( ASCAN( LI_MSF, 2 ) <> 0, 2, 1 ) )
prmsf := .T.
i := LEN( LI_MSF )
DO WHILE i > 0 .AND. LI_MSF[ i ] = Nil
i --
ENDDO
IF i < LEN( LI_MSF )
klfs := i
ENDIF
ENDIF
IF predit > 1
SET CURSOR ON
ELSE
SET CURSOR OFF
ENDIF
SET EXACT OFF
IF prsohr
wndbuf := SAVESCREEN( y1, x1, y2, x2 )
ENDIF
oldcolors := SETCOLOR()
SETCOLOR( LI_CLR )
@ y1, x1, y2, x2 BOX "敖審拂棲 "
IF title <> Nil
@ y1, ( x2 - x1 - 1 - LEN( title ) ) / 2 + x1 SAY " " + title + " "
ENDIF
IF title <> Nil .AND. LI_NAMES <> Nil
y1 ++
ENDIF
razmer := y2 - y1 - 1
IF .NOT. LI_PRFLT
LI_KOLZ := EVAL( LI_RCOU )
ENDIF
STORE 1 TO numfld
firstfld := LI_FREEZE + 1
firstfld := MSFNEXT( firstfld )
first_f := firstfld
STORE .T. TO rez
kolfld := FLDCOUNT( x1 + 2, x2 - 2, firstfld )
VIVNAMES( firstfld )
IF EVAL( LI_BEOF )
EVAL( LI_BGTOP )
LI_NSTR := 1
ELSE
EVAL( LI_BSKIP, - ( LI_NSTR - 1 ) )
IF EVAL( LI_BBOF )
LI_NSTR := 1
ENDIF
ENDIF
WNDVIVOD()
EVAL( LI_BSKIP, ( LI_NSTR - 1 ) )
IF LI_KOLZ = 0 .AND. predit = 3
LI_NSTR := 0
KEYBOARD CHR( 24 )
ENDIF
DO WHILE rez
SETCOLOR( LI_CLR )
EVAL( LI_B1 )
// IF predit>1
// SETCOLOR(LI_CLRV+"*") // <20>襪カ<E8A5AA><E382AB> 痰牀<E797B0>
// ELSE
SETCOLOR( LI_CLRV )
// ENDIF
VIVSTR( firstfld, LI_NSTR + y1, IF( predit > 1, numfld, 0 ) )
SETCOLOR( LI_CLR ) // <20>÷<EFBFBD><20><EFBFBD><EFBFBD>
/*
IF .NOT. ( TYPE("Sx_Keyno()") == "U")
@ y1+2,x2,y2-2,x2 BOX LEFT(str_bar,1)
@ y1+1,x2 SAY SUBSTR(str_bar,2,1)
@ y2-1,x2 SAY SUBSTR(str_bar,2,1)
fbar1="Sx_Keyno()"
fbar2="Sx_KeyCount()"
@ y1+2+INT(IIF(LI_PRFLT,LI_TEKZP,&fbar1)*(y2-y1-4)/IIF(LI_PRFLT,LI_KOLZ,&fbar2)),x2 SAY RIGHT(str_bar,1)
ENDIF
*/
IF prview
xkey := 27
ELSE
#ifdef VER_MOUSE
xkey := IN_KM( .F. )
IF xkey = 502
DO WHILE M_STAT() <> 0
ENDDO
xkey := 27
ELSEIF xkey = 501
ym := M_YTEXT()
xm := M_XTEXT()
IF ( ym <= y1 .OR. ym >= y2 .OR. xm <= x1 .OR. xm >= x2 )
IF xm <= x2 .AND. xm >= x1 .AND. ( ym = y1 .OR. ym = y2 )
M_SHOW()
i := SECONDS()
DO WHILE SECONDS() - i < 0.05
ENDDO
KEYBOARD CHR( IIF( ym = y1, 5, 24 ) )
M_HIDE()
LOOP
ELSEIF ctrl_ar <> Nil
FOR i := 1 TO LEN( ctrl_ar )
IF VALTYPE( ctrl_ar[ i ] ) = "C"
SETCOLOR( ctrl_ar[ i ] )
ELSE
rezproc := F_CTRL( ctrl_ar[ i ],,,,,, 1, ym, xm )
IF rezproc > 0
EXIT
ENDIF
ENDIF
NEXT
SETCOLOR( LI_CLR )
IF rezproc > 0
rezproc += 500
EXIT
ENDIF
ENDIF
ENDIF
ENDIF
#else
xkey := INKEY( 0 )
#endif
ENDIF
VIVSTR( firstfld, LI_NSTR + y1, 0 ) // 痰牀<E797B0>
IF xkey < 500
DO CASE
CASE xkey = 24 // <20>窶甌<E7AAB6> ↓├
IF ( LI_KOLZ > 0 .OR. predit = 3 ) .AND. ( LI_KOLZ = 0 .OR. .NOT. EVAL( LI_BEOF ) )
EVAL( LI_BSKIP, 1 )
IF EVAL( LI_BEOF ) .AND. ( predit < 3 .OR. LI_PRFLT )
EVAL( LI_BSKIP, - 1 )
ELSE
IF EVAL( LI_BEOF )
vartmp := firstfld
firstfld := first_f
numfld := first_f
kolfld := FLDCOUNT( x1 + 2, x2 - 2, firstfld )
IF vartmp > first_f
EVAL( LI_BSKIP, - 1 )
EVAL( LI_BSKIP, - ( LI_NSTR - 1 ) )
WNDVIVOD()
EVAL( LI_BSKIP, LI_NSTR - 1 )
EVAL( LI_BSKIP )
ENDIF
ENDIF
LI_NSTR ++
IF LI_NSTR > razmer
LI_NSTR := razmer
SCROLL( y1 + 1, x1 + 1, y2 - 1, x2 - 1, 1 )
VIVSTR( firstfld, y2 - 1, 0 )
ENDIF
IF EVAL( LI_BEOF )
KEYBOARD CHR( 13 )
ENDIF
ENDIF
ENDIF
CASE xkey = 5 .AND. LI_KOLZ > 0 // <20>窶甌<E7AAB6> □ム<E296A1>
EVAL( LI_BSKIP, - 1 )
IF EVAL( LI_BBOF )
EVAL( LI_BGTOP )
ELSE
LI_NSTR := LI_NSTR - 1
IF LI_NSTR = 0
LI_NSTR := 1
SCROLL( y1 + 1, x1 + 1, y2 - 1, x2 - 1, - 1 )
VIVSTR( firstfld, y1 + 1, 0 )
ENDIF
ENDIF
CASE xkey = 4 .AND. LI_KOLZ <> 0 // <20>窶甌<E7AAB6> <20><><EFBFBD>
IF predit > 1
IF numfld < kolfld
numfld ++
LOOP
ENDIF
ENDIF
IF kolfld + firstfld - LI_FREEZE - 1 < klfs
i := firstfld + kolfld
DO WHILE kolfld + firstfld - LI_FREEZE - 1 < klfs .AND. firstfld + kolfld == i
firstfld ++
firstfld := MSFNEXT( firstfld )
kolfld := FLDCOUNT( x1 + 2, x2 - 2, firstfld )
ENDDO
numfld := i - firstfld + 1
EVAL( LI_BSKIP, - ( LI_NSTR - 1 ) )
WNDVIVOD()
EVAL( LI_BSKIP, LI_NSTR - 1 )
ENDIF
VIVNAMES( firstfld )
CASE xkey = 19 // <20>窶甌<E7AAB6> ←ア<E28690>
IF predit > 1
IF numfld <> 1
numfld --
LOOP
ENDIF
ENDIF
IF firstfld > first_f
firstfld --
DO MSFBACK WITH firstfld
kolfld := FLDCOUNT( x1 + 2, x2 - 2, firstfld )
numfld := 1
EVAL( LI_BSKIP, - ( LI_NSTR - 1 ) )
WNDVIVOD()
EVAL( LI_BSKIP, LI_NSTR - 1 )
ENDIF
VIVNAMES( firstfld )
CASE xkey = 3 // PgDn
EVAL( LI_BSKIP, razmer - LI_NSTR + 1 )
LI_NSTR := 1
IF EVAL( LI_BEOF )
EVAL( LI_BSKIP, - 1 )
ENDIF
WNDVIVOD()
CASE xkey = 18 // PgUp
IF LI_NSTR > 1
EVAL( LI_BSKIP, - ( LI_NSTR - 1 ) )
LI_NSTR := 1
ELSE
EVAL( LI_BSKIP, - razmer )
IF EVAL( LI_BBOF )
EVAL( LI_BGTOP )
ENDIF
WNDVIVOD()
ENDIF
CASE xkey = 6 .AND. LI_KOLZ > 0 // End
EVAL( LI_BGBOT )
EVAL( LI_BSKIP, - ( razmer - 1 ) )
LI_NSTR := WNDVIVOD()
EVAL( LI_BSKIP, LI_NSTR - 1 )
CASE xkey = 1 .AND. LI_KOLZ > 0 // Home
LI_NSTR := 1
EVAL( LI_BGTOP )
WNDVIVOD()
CASE xkey = 13 .AND. predit < 2 // Enter
rez := .F.
rezproc := xkey
CASE ( xkey = 13 .OR. ( xkey > 47 .AND. xkey < 58 ) .OR. ( xkey > 64 .AND. xkey < 91 ) ;
.OR. ( xkey > 96 .AND. xkey < 123 ) .OR. ( xkey > 127 .AND. xkey < 176 ) .OR. ( xkey > 223 .AND. xkey < 240 ) ) .AND. predit > 1 // Enter
// <20><EFBFBD><E382A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
fipos := numfld + firstfld - 1 - LI_FREEZE
IF LI_WHEN = Nil .OR. LEN( LI_WHEN ) < fipos .OR. LI_WHEN[ fipos ] = Nil .OR. EVAL( LI_WHEN[ fipos ] )
IF prmsf
vartmp := IIF( LEN( LI_MSF ) < fipos, 1, LI_MSF[ fipos ] )
IF VALTYPE( vartmp ) = "N"
IF vartmp <> 2
LOOP
ENDIF
ELSE
LOOP
ENDIF
ENDIF
SET CURSOR ON
SETCOLOR( LI_CLRV + "," + LI_CLRV )
IF xkey <> 13
KEYBOARD CHR( xkey )
ENDIF
vartmp := READEXIT( .T. )
varbuf := FIELDGET( fipos )
@ LI_NSTR + y1, xfld GET varbuf PICTURE Defpict( fipos, x2 - x1 - 3 )
IF LI_VALID <> Nil .AND. LEN( LI_VALID ) >= fipos .AND. LI_VALID[ fipos ] <> Nil
Getlist[ 1 ] :postBlock := LI_VALID[ fipos ]
ENDIF
READ
IF LASTKEY() <> 27 .AND. UPDATED()
IF EVAL( LI_BEOF )
APPEND BLANK
LI_KOLZ := EVAL( LI_RCOU )
ELSE
IF .NOT. SET( _SET_EXCLUSIVE )
RLOCK()
IF NETERR()
LOOP
ENDIF
ENDIF
ENDIF
FIELDPUT( fipos, varbuf )
IF .NOT. SET( _SET_EXCLUSIVE )
UNLOCK
ENDIF
ENDIF
IF ( LASTKEY() = 27 .OR. .NOT. UPDATED() ) .AND. EVAL( LI_BEOF )
SETCOLOR( LI_CLR )
@ LI_NSTR + y1, x1 + 1 CLEAR TO LI_NSTR + y1, x2 - 1
LI_NSTR --
EVAL( LI_BSKIP, - 1 )
ELSE
IF ( vartmp := LASTKEY() ) <> 13 .AND. vartmp <> 27 .AND. vartmp < 32
KEYBOARD CHR( vartmp )
ENDIF
ENDIF
READEXIT( vartmp )
SET CURSOR OFF
ENDIF
CASE xkey = 27 // Esc
rez := .F.
rezproc := 0
CASE xkey = - 1 .AND. ( maskey = Nil .OR. ASCAN( maskey, xkey ) = 0 ) // F2
IF predit = 1
predit := predxx
ELSEIF predit > 1
predit := 1
ENDIF
OTHERWISE
IF maskey <> Nil
IF ASCAN( maskey, xkey ) <> 0
rez := .F.
rezproc := xkey
ENDIF
ENDIF
ENDCASE
#ifdef VER_MOUSE
ELSE
IF ym > y1 .AND. ym < y2 .AND. xm > x1 .AND. xm < x2
IF predit < 2
IF LI_NSTR = ym - y1
rez := .F.
rezproc := 13
ELSE
EVAL( LI_BSKIP, ym - y1 - LI_NSTR )
LI_NSTR := ym - y1
ENDIF
ELSE
i := FLDCOUNT( x1 + 2, xm, firstfld ) + 1
IF i <= FLDCOUNT( x1 + 2, x2 - 2, firstfld )
IF i = 2 .AND. xm < x1 + 2 + LEN( FLDSTR( firstfld + numfld - 1 ) )
i := 1
ENDIF
IF numfld <> i .OR. LI_NSTR <> ym - y1
numfld := i
EVAL( LI_BSKIP, ym - y1 - LI_NSTR )
LI_NSTR := ym - y1
ELSE
KEYBOARD CHR( 13 )
ENDIF
ENDIF
ENDIF
ENDIF
M_SHOW()
DO WHILE M_STAT() <> 0
ENDDO
M_HIDE()
#endif
ENDIF
ENDDO
IF prsohr
RESTSCREEN( IIF( title <> Nil .AND. LI_NAMES <> Nil, y1 - 1, y1 ), x1, y2, x2, wndbuf )
ENDIF
SETCOLOR( oldcolors )
SET CURSOR ON
RETURN rezproc
*+臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼
*+
*+ Function FLDCOUNT()
*+
*+ Called from ( sample.prg ) 6 - function dbflist()
*+
*+臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼
*+
FUNCTION FLDCOUNT( xstrt, xend, fld1 )
LOCAL klf, i
klf := 0
i := IIF( LI_FREEZE > 0, 1, fld1 )
i := MSFNEXT( i )
DO WHILE .T.
xstrt := xstrt + MAX( LEN( FLDSTR( i ) ), IIF( LI_NAMES <> Nil .AND. LEN( LI_NAMES ) >= i, LEN( LI_NAMES[ i ] ), 0 ) ) - 1
IF xstrt > xend
RETURN IIF( klf = 0, 1, klf )
ENDIF
klf := klf + 1
i := IIF( i = LI_FREEZE, fld1, i + 1 )
i := MSFNEXT( i )
xstrt := xstrt + 2
IF i > klfs
RETURN IIF( klf = 0, 1, klf )
ENDIF
ENDDO
RETURN IIF( klf = 0, 1, klf )
*+臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼
*+
*+ Function MSFNEXT()
*+
*+ Called from ( sample.prg ) 2 - function dbflist()
*+ 2 - function fldcount()
*+ 2 - function vivnames()
*+ 2 - procedure vivstr()
*+
*+臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼
*+
FUNCTION MSFNEXT( fldnext )
LOCAL vartmp
IF prmsf
DO WHILE fldnext <= LEN( LI_MSF ) .AND. fldnext <= klfs
vartmp := LI_MSF[ fldnext ]
IF VALTYPE( vartmp ) = "N"
IF vartmp = 1
fldnext ++
ELSE
EXIT
ENDIF
ELSE
EXIT
ENDIF
ENDDO
ENDIF
RETURN fldnext
*+臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼
*+
*+ Procedure MSFBACK()
*+
*+臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼
*+
PROCEDURE MSFBACK( fldnext )
LOCAL vartmp
IF prmsf
DO WHILE fldnext <= LEN( LI_MSF ) .AND. fldnext > first_f
vartmp := LI_MSF[ fldnext ]
IF VALTYPE( vartmp ) = "N"
IF vartmp = 1
fldnext := fldnext - 1
ELSE
EXIT
ENDIF
ELSE
EXIT
ENDIF
ENDDO
ENDIF
RETURN
*+臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼
*+
*+ Function VIVNAMES()
*+
*+ Called from ( sample.prg ) 3 - function dbflist()
*+
*+臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼
*+
FUNCTION VIVNAMES( fifld )
LOCAL i, x, oldc, fif
IF LI_NAMES <> Nil
x := x1 + 2
i := 1
IF LI_NMCLR <> Nil
oldc := SETCOLOR( LI_NMCLR )
ENDIF
@ y1, x - 1 CLEAR TO y1, x2 - 1
fif := IIF( LI_FREEZE > 0, 1, fifld )
fif := MSFNEXT( fif )
DO WHILE i <= kolfld .AND. fif <= LEN( LI_NAMES )
IF LI_NAMES[ fif ] <> Nil
@ y1, x SAY LI_NAMES[ fif ]
ENDIF
x := x + MAX( LEN( FLDSTR( fif ) ), LEN( LI_NAMES[ fif ] ) ) + 1
fif := IIF( fif = LI_FREEZE, fifld, fif + 1 )
fif := MSFNEXT( fif )
i ++
ENDDO
IF LI_NMCLR <> Nil
SETCOLOR( oldc )
ENDIF
ENDIF
RETURN Nil
*+臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼
*+
*+ Function WNDVIVOD()
*+
*+ Called from ( sample.prg ) 8 - function dbflist()
*+
*+臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼
*+
FUNCTION WNDVIVOD
LOCAL firstrec, nstr, tekzp1
IF LI_PRFLT
tekzp1 := LI_TEKZP
ENDIF
firstrec := RECNO()
SETCOLOR( LI_CLR )
@ y1+1,x1+1 CLEAR TO y2-1,x2-1
@ y1, x1, y2, x2 BOX "敖審拂棲 "
IF title <> Nil
@ y1, ( x2 - x1 - 1 - LEN( title ) ) / 2 + x1 SAY " " + title + " "
ENDIF
nstr := 1
DO WHILE .T.
VIVSTR( firstfld, nstr + y1, 0 )
nstr := nstr + 1
EVAL( LI_BSKIP, 1 )
IF nstr > razmer .OR. EVAL( LI_BEOF )
EXIT
ENDIF
ENDDO
IF LI_PRFLT
LI_TEKZP := tekzp1
ENDIF
GO firstrec
RETURN nstr - 1
*+臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼
*+
*+ Procedure VIVSTR()
*+
*+ Called from ( sample.prg ) 4 - function dbflist()
*+ 1 - function wndvivod()
*+
*+臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼
*+
PROCEDURE VIVSTR( fifld, nstroka, vybfld )
LOCAL x, i, shablon, sviv, fif
xfld := x := x1 + 2
IF LI_KOLZ > 0
fif := IIF( LI_FREEZE > 0, 1, fifld )
IF fifld <> first_f .AND. vybfld = 0
@ nstroka, x1 + 1 SAY "<"
ENDIF
IF DELETED()
@ nstroka, x1 + 1 SAY "*"
ENDIF
FOR i := 1 TO kolfld
IF i = numfld
xfld := x
ENDIF
IF vybfld = 0 .OR. vybfld = i
MSFNEXT( fif )
sviv := FLDSTR( fif )
sviv := IIF( LEN( sviv ) < x2 - 1 - x, sviv, SUBSTR( sviv, 1, x2 - 1 - x ) )
@ nstroka, x SAY sviv
ELSE
sviv := FLDSTR( fif )
sviv := IIF( LEN( sviv ) < x2 - 1 - x, sviv, SUBSTR( sviv, 1, x2 - 1 - x ) )
ENDIF
x := x + MAX( LEN( sviv ), IIF( LI_NAMES <> Nil .AND. LEN( LI_NAMES ) >= fif, LEN( LI_NAMES[ fif ] ), 0 ) ) + 1
fif := IIF( fif = LI_FREEZE, fifld, fif + 1 )
NEXT
MSFNEXT( fif )
IF fif <= klfs .AND. vybfld = 0
IF x2 - 1 - x > 0
sviv := FLDSTR( fif )
@ nstroka, x SAY SUBSTR( sviv, 1, x2 - 1 - x )
ENDIF
@ nstroka, x2 - 1 SAY ">"
ENDIF
ENDIF
RETURN
*+臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼
*+
*+ Function FLDSTR()
*+
*+ Called from ( sample.prg ) 1 - function dbflist()
*+ 1 - function fldcount()
*+ 1 - function vivnames()
*+ 3 - procedure vivstr()
*+
*+臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼
*+
FUNCTION FLDSTR( numf )
LOCAL fldtype, rez, vartmp
IF prmsf
IF numf <= LEN( LI_MSF )
vartmp := LI_MSF[ numf ]
IF ( fldtype := VALTYPE( vartmp ) ) = "B"
RETURN EVAL( vartmp )
ELSEIF fldtype = "C"
RETURN " <Memo> "
ENDIF
ENDIF
ENDIF
fldtype := LI_MSTYP[ numf ]
DO CASE
CASE fldtype = "C"
rez := FIELDGET( numf )
CASE fldtype = "N"
rez := STR( FIELDGET( numf ), LI_MSLEN[ numf ], LI_MSDEC[ numf ] )
CASE fldtype = "D"
rez := DTOC( FIELDGET( numf ) )
CASE fldtype = "L"
rez := IIF( FIELDGET( numf ), "T", "F" )
CASE fldtype = "M"
rez := " <Memo> "
ENDCASE
RETURN rez
*+臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼
*+
*+ Function InitList()
*+
*+ Called from ( sample.prg ) 1 - function main()
*+
*+臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼
*+
FUNCTION InitList
LI_NSTR := 1
LI_CLR := "W+/B"
LI_CLRV := "R/W"
LI_BSKIP := { | x | FSKIP( x ) }
LI_BGTOP := { || FGOTOP() }
LI_BGBOT := { || FGOBOT() }
LI_BEOF := { || FEOF() }
LI_BBOF := { || FBOF() }
LI_B1 := { || DEVPOS( y2, x1 + 2 ), DEVOUT( IIF( LI_PRFLT, "<22>┼赳<E294BC>" + STR( LI_TEKZP, 5 ), STR( RECNO(), 6 ) ) + "/" + STR( LI_KOLZ, 6 ) ) }
LI_MSF := 0
LI_FREEZE := 0
LI_RCOU := { || RECCOUNT() }
LI_MSREC := ARRAY( 50 )
LI_PRFLT := .F.
LI_TEKZP := 1
DO FLMSFLD
RETURN Nil
*+臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼
*+
*+ Function FGOTOP()
*+
*+ Called from ( sample.prg ) 1 - function initlist()
*+
*+臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼
*+
FUNCTION FGOTOP
IF LI_PRFLT
IF LI_KOLZ > 0
LI_TEKZP := 1
GO LI_MSREC[ 1 ]
ENDIF
ELSE
GO TOP
ENDIF
RETURN Nil
*+臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼
*+
*+ Function FGOBOT()
*+
*+ Called from ( sample.prg ) 1 - function initlist()
*+
*+臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼
*+
FUNCTION FGOBOT
IF LI_PRFLT
LI_TEKZP := LI_KOLZ
GO IIF( LI_KOLZ < 50, LI_MSREC[ LI_KOLZ ], LI_MSREC[ 50 ] )
ELSE
GO BOTTOM
ENDIF
RETURN Nil
*+臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼
*+
*+ Procedure FSKIP()
*+
*+ Called from ( sample.prg ) 1 - function initlist()
*+
*+臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼
*+
PROCEDURE FSKIP( kolskip )
LOCAL tekzp1
IF LI_PRFLT
IF LI_KOLZ = 0
RETURN
ENDIF
tekzp1 := LI_TEKZP
LI_TEKZP := LI_TEKZP + kolskip + IIF( tekzp1 = 0, 1, 0 )
IF LI_TEKZP < 1
LI_TEKZP := 0
GO LI_MSREC[ 1 ]
ELSEIF LI_TEKZP > LI_KOLZ
LI_TEKZP := LI_KOLZ + 1
GO IIF( LI_KOLZ < 50, LI_MSREC[ LI_KOLZ ], LI_MSREC[ 50 ] )
ELSE
IF LI_TEKZP > 50 - 1
SKIP IIF( tekzp1 = LI_KOLZ + 1, kolskip + 1, kolskip )
ELSE
GO LI_MSREC[ LI_TEKZP ]
ENDIF
ENDIF
ELSE
SKIP kolskip
ENDIF
RETURN
*+臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼
*+
*+ Function FBOF()
*+
*+ Called from ( sample.prg ) 1 - function initlist()
*+
*+臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼
*+
FUNCTION FBOF
IF LI_PRFLT
RETURN IIF( LI_TEKZP = 0, .T., .F. )
ENDIF
RETURN BOF()
*+臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼
*+
*+ Function FEOF()
*+
*+ Called from ( sample.prg ) 1 - function initlist()
*+
*+臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼
*+
FUNCTION FEOF
IF LI_PRFLT
RETURN IIF( LI_TEKZP > LI_KOLZ, .T., .F. )
ENDIF
RETURN EOF()
*+臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼
*+
*+ Procedure FLMSFLD()
*+
*+臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼
*+
PROCEDURE FLMSFLD
LOCAL arlen
arlen := FCOUNT()
IF LI_MSNAME = Nil
LI_MSNAME := ARRAY( arlen )
LI_MSTYP := ARRAY( arlen )
LI_MSLEN := ARRAY( arlen )
LI_MSDEC := ARRAY( arlen )
AFIELDS( LI_MSNAME, LI_MSTYP, LI_MSLEN, LI_MSDEC )
ENDIF
RETURN
*+臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼
*+
*+ Function Defpict()
*+
*+ Called from ( sample.prg ) 1 - function dbflist()
*+
*+臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼
*+
FUNCTION Defpict( i, maxlen )
LOCAL spict, fldd
DO CASE
CASE LI_MSTYP[ i ] = "C"
spict := IIF( maxlen = Nil, REPLICATE( "X", LI_MSLEN[ i ] ), "@S" + NUM_STR( maxlen, 2 ) )
CASE LI_MSTYP[ i ] = "N"
fldd := LI_MSDEC[ i ]
spict := IIF( fldd = 0, REPLICATE( "9", LI_MSLEN[ i ] ), REPLICATE( "9", LI_MSLEN[ i ] - 1 - fldd ) + "." + REPLICATE( "9", fldd ) )
CASE LI_MSTYP[ i ] = "D"
spict := "@D"
ENDCASE
RETURN spict
*+臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼
*+
*+ Function NUM_STR()
*+
*+ Called from ( sample.prg ) 1 - function defpict()
*+
*+臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼臼
*+
FUNC NUM_STR( NOM, KOLZN )
NOM := INT( NOM )
RETURN ( REPLICATE( "0", KOLZN - LEN( LTRIM( STR( NOM ) ) ) ) + LTRIM( STR( NOM ) ) )