Estou ainda curioso e ancioso para ver o que irá disponibilizar para nós, colega.
Fiz como tinha prometido, outro teste, desta vez através do TBROWSE com MATRIZes e falta adicionar as funções de movimentação entre seções através do TABe SHIFT-TAB. Mas segue abaixo para apreciação e critica.
Código: Selecionar todos
* GETs com MATRIZ
#include "inkey.ch"
#define CURSOR(P_CUR) (SETCURSOR( IIF( P_CUR = 0, 0, IIF( READINSERT(), 3, 1 ) ) ))
#define AR_SKIPBLOCK(atb,ai,aLinha) atb:skipblock={|n, sa| sa:=ai,iif(ai+n > LEN(aLinha[1]), ai:=LEN(aLinha[1]), iif(ai+n < 1, ai:=1, ai += n)), ai-sa}
set score off
cls
SET CURSOR OFF
CONTECOR := { "09/01","00/07","15/04","15/01","00/03","00/07","04/07","08/07","15/03","15/02","15/04","14/07","15/03" }
// aMyGetList:={linha,coluna,say,color_say,get,picture,color_get,when,valid}
aMyGetList:={ {01,02,padc(" Cadastro do cliente ",76,"Ä"),"W+/B",,,,,},;
{02,02,"Codigo do Cliente......:","W+/B",0,"9999","N/BG",,},;
{03,02,"Nome do Cliente........:","W+/B",space(30),"@!","N/BG",,},;
{04,02,padc(" Residencia ",76,"Ä"),"W+/B",,,,,},;
{05,02,"Endereco............:","W+/B",space(40),"@!","N/BG",,},;
{06,02,"Bairro..............:","W+/B",space(25),"@!","N/BG",,},;
{07,02,"Cidade..............:","W+/B",space(20),"@!","N/BG",,},;
{08,02,padc(" Filiacao ",76,"Ä"),"W+/B",,,,,},;
{09,02,"Nome do pai...:","W+/B",space(30),"@!","N/BG",,},;
{10,02,"Nome do mae...:","W+/B",space(30),"@!","N/BG",,},;
{11,02,padc(" Referencia bancaria ",76,"Ä"),"W+/B",,,,,},;
{12,02,"Banco...:","W+/B",space(25),"@!","N/BG",,},;
{12,42,"Agencia.:","W+/B",0,"999","N/BG",,},;
{12,59,"N§ conta:","W+/B",0,"999999","N/BG",,},;
{13,02,"Banco...:","W+/B",space(25),"@!","N/BG",,},;
{13,42,"Agencia.:","W+/B",0,"999","N/BG",,},;
{13,59,"N§ conta:","W+/B",0,"999999","N/BG",,},;
{14,02,"Banco...:","W+/B",space(25),"@!","N/BG",,},;
{14,42,"Agencia.:","W+/B",0,"999","N/BG",,},;
{14,59,"N§ conta:","W+/B",0,"999999","N/BG",,},;
{15,02,padc(" Referencia comercial ",76,"Ä"),"W+/B",,,,,},;
{16,02,"Nome da empresa..:","W+/B",space(56),"@!","N/BG",,},;
{17,02,"Nome da empresa..:","W+/B",space(56),"@!","N/BG",,},;
{18,02,"Nome da empresa..:","W+/B",space(56),"@!","N/BG",,},;
{19,02,"Nome da empresa..:","W+/B",space(56),"@!","N/BG",,},;
{20,02,padc(" Referencia industrial ",76,"Ä"),"W+/B",,,,,},;
{21,02,"Nome da industria.....:","W+/B",space(50),"@!","N/BG",,},;
{22,02,"Nome da industria.....:","W+/B",space(50),"@!","N/BG",,},;
{23,02,"Nome da industria.....:","W+/B",space(50),"@!","N/BG",,},;
{24,02,"Nome da industria.....:","W+/B",space(50),"@!","N/BG",,} }
aLinha:={{},{}}
nTam:=len(aMyGetList)
nLinha:=0
vLinha:=""
vIni:=""
aElem:={}
FOR I=1 TO nTam
IF !(aMyGetList[I,1]=nLinha)
IF !EMPTY(vLinha)
AADD(aLinha[1],vLinha)
AADD(aLinha[2],aElem)
ENDIF
vIni:=""
vLinha:=""
aElem:={}
nLinha:=aMyGetList[I,1]
ELSE
vIni:=SPACE( ((aMyGetList[I,2]-1)-LEN(vLinha))-1 )
ENDIF
IF aMyGetList[I,5]=NIL
vLinha:=vLinha+vIni+aMyGetList[I,3]
ELSE
vLinha:=vLinha+vIni+aMyGetList[I,3]+" "+TRANSFORM(aMyGetList[I,5],aMyGetList[I,6])
AADD(aElem,I)
ENDIF
NEXT
aTab:={2,4,8,11,21,26}
// @ 24,00 say padc("Utilize <Tab> e <Shift><Tab> para movimentar-se entre se‡”es",80) COLOR "N/W"
BROWSREADER(01,01,22,78,aLinha,aMYGetList,aTab,LEN(aLinha[1]))
FUNCTION BROWSREADER(tt,tl,bb,br,aLinha,aMYGetList,aTab,nConta)
LOCAL exit_requested:=.F., lkey
PRIVATE aindex:=1
SET COLOR TO (CONTECOR[2])
@ tt-1,tl-1 CLEAR TO bb+1,br+1
SET COLOR TO (CONTECOR[12])
@ tt-1,tl-1 TO bb+1,br+1
SET COLOR TO (CONTECOR[2])
SOMBRA(tt-1,tl-1,bb+1,br+1)
SET COLOR TO (CONTECOR[2] + "," + CONTECOR[9])
ab:=tbrowsenew(tt,tl+1,bb,br)
ab:gobottomblock={||aindex:=LEN(aLinha[1])}
ab:gotopblock={||aindex:=1}
AR_SKIPBLOCK(ab,aindex,aLinha)
ab:colorSpec := CONTECOR[2]+","+CONTECOR[9]+","+CONTECOR[10]+","+CONTECOR[8]+","+SUBSTR(CONTECOR[10],1,2)+"/"+SUBSTR(CONTECOR[9],4,2)+"*"
coluna := TBColumnNew("",{|| PADR(aLinha[1,aindex],76) })
// coluna:colorblock({ || IIf( Substr(aLinha[1,aindex],6,1)="*", {3,5}, {4,2}) })
ab:addcolumn(coluna)
exit_requested=.F.
DO WHILE !exit_requested
DO WHILE (!ab:stabilize())
lKey := InKey()
if ( lKey != 0 )
exit
endif
ENDDO
if ( ab:stable )
lKey := INKEY(0)
endif
DO CASE
CASE lkeY=K_F1
CASE lkeY=K_DOWN
VEZES:=PROX_DOWN(AINDEX,aLinha)
IF VEZES=0
FOR Z=1 TO LEN(aLinha[1])
IF !EMPTY(aLinha[2,Z])
VEZES:=Z-1
EXIT
ENDIF
NEXT
ab:GOTOP()
ENDIF
FOR Z=1 TO VEZES
ab:Down()
NEXT
CASE lkeY=K_UP
VEZES:=PROX_UP(AINDEX,aLinha)
IF VEZES=0
ab:GOBOTTOM()
ENDIF
FOR Z=1 TO VEZES
ab:UP()
NEXT
CASE lkeY=K_PGDN
ab:PAGEDOWN()
CASE lkeY=K_PGUP
ab:PAGEUP()
CASE lkeY=K_CTRL_PGUP
ab:GOTOP()
CASE lkeY=K_CTRL_PGDN
ab:GOBOTTOM()
CASE lkeY=K_RIGHT
ab:RIGHT()
CASE lkeY=K_LEFT
ab:LEFT()
CASE lkeY=K_HOME
ab:HOME()
CASE lkeY=K_END
ab:END()
CASE LKEY=K_CTRL_LEFT
AB:PANLEFT()
CASE LKEY=K_CTRL_RIGHT
AB:PANRIGHT()
CASE LKEY=K_CTRL_HOME
AB:PANHOME()
CASE LKEY=K_CTRL_END
AB:PANEND()
CASE LKEY=K_TAB
AB:RIGHT()
CASE LKEY=K_ESC
exit_requested=.t.
aindex=0
CASE lkeY=K_RETURN
IF LEN(aLinha[2,AINDEX])=1
nVet:=aLinha[2,AINDEX,1]
vLinha:=aLinha[1,nVet]
SET CURSOR ON
@ ROW(),aMyGetList[nVet,2] SAY SPACE(76) COLOR CONTECOR[2]
@ ROW(),aMyGetList[nVet,2] SAY aMyGetList[nVet,3] GET aMyGetList[nVet,5] PICTURE aMyGetList[nVet,6] COLOR aMyGetList[nVet,7]
READ
IF LASTKEY()=13
vLinha:=aMyGetList[nVet,3]+" "+TRANSFORM(aMyGetList[nVet,5],aMyGetList[nVet,6])
aLinha[1,AINDEX]:=vLinha
ab:refreshCurrent()
ENDIF
ELSE
vIni:=""
vLinha:=""
nln:=ROW()
@ nln,aLinha[2,AINDEX] SAY SPACE(76) COLOR CONTECOR[2]
FOR Z=1 TO LEN(aLinha[2,AINDEX])
nVet:=aLinha[2,AINDEX,Z]
@ nln,aMyGetList[nVet,2] SAY aMyGetList[nVet,3]
@ nln,aMyGetList[nVet,2]+len(aMyGetList[nVet,3]+" ") PROMPT TRANSFORM(aMyGetList[nVet,5],aMyGetList[nvet,6])
NEXT
MENU TO OP
IF LASTKEY()=13
VOP:=aLinha[2,AINDEX,OP]
vLinha:=aLinha[1,VOP]
SET CURSOR ON
@ nln,aMyGetList[VOP,2] SAY aMyGetList[VOP,3] GET aMyGetList[VOP,5] PICTURE aMyGetList[VOP,6] COLOR aMyGetList[VOP,7]
READ
ENDIF
IF LASTKEY()=13
vLinha:=""
FOR Z=1 TO LEN(aLinha[2,AINDEX])
nVet:=aLinha[2,AINDEX,Z]
vIni:=SPACE( ((aMyGetList[nVet,2]-1)-LEN(vLinha))-1 )
vLinha:=vLinha+vIni+aMyGetList[nVet,3]+" "+TRANSFORM(aMyGetList[nVet,5],aMyGetList[nVet,6])
NEXT
aLinha[1,AINDEX]:=vLinha
ab:refreshCurrent()
ENDIF
ENDIF
SET CURSOR OFF
OTHERWISE
KEYBOARD( CHR(lkey) )
ab:refreshCurrent()
ENDCASE
ENDDO
RETURN aLinha
FUNCTION SOMBRA( LIN_SUP, COL_SUP, LIN_INF, COL_INF )
IF PCOUNT() = 2 .OR. PCOUNT() = 3
C_SOM := COL_SUP; L_SOM := LIN_SUP
LIN_SUP := VAL( SUBS( C_SOM, 1, 2 ) )
COL_SUP := VAL( SUBS( C_SOM, 3, 2 ) )
LIN_INF := VAL( SUBS( C_SOM, 5, 2 ) )
COL_INF := VAL( SUBS( C_SOM, 7, 2 ) )
COL_SOM := SUBS( C_SOM, 9 )
LIN_SOM := L_SOM
ENDIF
IF COL_SUP < 2 .OR. LIN_INF > 22
C_SOM := ""; L_SOM := ""
RETURN .F.
ENDIF
IF PCOUNT() = 3
RESTSCREEN( LIN_SUP + 1, COL_SUP - 2, LIN_INF + 1, COL_SUP - 1, COL_SOM )
RESTSCREEN( LIN_INF + 1, COL_SUP - 2, LIN_INF + 2, COL_INF - 2, LIN_SOM )
RETURN .F.
ENDIF
IF PCOUNT() != 2
COL_SOM := SAVESCREEN( LIN_SUP + 1, COL_SUP - 2, LIN_INF + 1, COL_SUP - 1 )
LIN_SOM := SAVESCREEN( LIN_INF + 1, COL_SUP - 2, LIN_INF + 2, COL_INF - 2 )
ENDIF
IF SUBS( COL_SOM, 2, 1 ) != CHR( 8 )
C_SOM := STR( LIN_SUP, 2 ) + STR( COL_SUP, 2 ) + STR( LIN_INF, 2 ) +;
STR( COL_INF, 2 ) + COL_SOM
L_SOM := LIN_SOM
ENDIF
FOR I = 2 TO LEN( COL_SOM ) STEP 2
COL_SOM := STUFF( COL_SOM, I, 1, CHR( 8 ) )
NEXT
FOR I = 2 TO LEN( LIN_SOM ) / 2 STEP 2
LIN_SOM := STUFF( LIN_SOM, I, 1, CHR( 8 ) )
NEXT
RESTSCREEN( LIN_SUP + 1, COL_SUP - 2, LIN_INF + 1, COL_SUP - 1, COL_SOM )
RESTSCREEN( LIN_INF + 1, COL_SUP - 2, LIN_INF + 2, COL_INF - 2, LIN_SOM )
RETURN .T.
FUNCTION MENSAGEM( TEXTO, PAUSA )
STATIC ULT_MENSAGEM := ""
LOCAL ULT_CURSOR := SETCURSOR()
IF TEXTO = NIL; TEXTO := ""; ENDIF
CURSOR( 0 )
@ MAXROW(), 11 SAY PADC( TEXTO, 58 ) COLOR CONTECOR[ 2 ]
IF PAUSA = NIL
ULT_MENSAGEM := TEXTO
ELSE
INKEY( PAUSA )
@ MAXROW(), 11 SAY PADC( ULT_MENSAGEM, 58 ) COLOR CONTECOR[ 2 ]
ENDIF
SETCURSOR( ULT_CURSOR )
RETURN NIL
FUNCTION PROX_DOWN(AINDEX,aLinha)
Local nP,U,nIn
nP:=0
nIn:=AINDEX+1
FOR U=nIn TO LEN(aLinha[1])
IF !EMPTY(aLinha[2,u])
nP:=u
EXIT
ENDIF
NEXT
IF NP>0
nP:=nP-AINDEX
ENDIF
RETURN nP
FUNCTION PROX_UP(AINDEX,aLinha)
Local nP,U,nIn
nP:=0
nIn:=AINDEX-1
FOR U=nIn TO 1 STEP -1
IF !EMPTY(aLinha[2,u])
nP:=u
EXIT
ENDIF
NEXT
IF NP>0
nP:=AINDEX-nP
ENDIF
RETURN nP
Utilizei a mesma matriz do exemplo anterior. O único inconveniente que vejo neste procedimento é que não obedece regra alguma na sequência do prenchimento de uma ficha (como por exemplo neste caso). Sabemos que nas definições de alguns GETs são esenciais para determnar alguma ação variada, condionada ou atrelada com o prenchimento de determinado GET. Embora neste procedimento que a principio aceitaria qualque ordem de prenchimento, poderia ser condicionado e ainda ser útil para ALTERAR um registro ja existem.
Espero que gostem e façam comentários, aceitarei bem qualquer crítica e aguardarei o colega Kebe para mostrarnos sua técnica, que aliás gostei muito.