Página 2 de 2

ACHOICE vs GETSYS => listbox

Enviado: 27 Jun 2008 09:14
por Pablo César
Pois é Ademir, na minha opinião você vai perder mais tempo tentado consertar situações quanto a navegação dos GETs do que fazendo um GETSYS.PRG específico. Gostariamos saber como você resolveu o caso e poste o exemplo. Se precisar de ajuda, estamos aqui.

Re: Navegação de gets usando gets comuns e com listbox

Enviado: 27 Jun 2008 09:38
por Ademir
Bom dia Pablo !

Apenas criei uma função chamada Help() que abre um achoice com as opções dependendo do campo editado. Ela é acionada atraves do F1. Achei melhor o F1 porque descobrí recentemente que se vc criar uma função com o nome Help(), não é necessário usar o Set Key 28 to funçao() (pelo menos na 5.3). O achoice é aberto abaixo do get, como se fosse um listbox(). É isso... []s

Re: Navegação de gets usando gets comuns e com listbox

Enviado: 27 Jun 2008 09:53
por Pablo César
Ahhh então você abandonou a idéia de sair do seu LISTBOX quando usuário vai até o primeiro intem do listbox e continua pressionando seta para cima e daí sai do LISTBOX e passa para o GET anterior ? Ou você conseguiu reproduzir justamente isso ?. Porque seria interessante ver como foi feito. Eu com achoice tive muitas dificuldades (por não dizer muitas gambiarras, para que desse certo), mas no GETSYS ficou melhor que os ACHOICEs que eu tinha feito. Se puder postar exemplo, caso tenha obtido sucesso, digo.

Re: Navegação de gets usando gets comuns e com listbox

Enviado: 27 Jun 2008 10:23
por Ademir
É Pablo... fazer a saida do listbox para o get anterior com as setas achei meio complicado, pra não dizer inviavel. Imagine um listbox com 50 itens. O usuário posiciona o cursor no penultimo, e aí vê que o campo anterior está errado. Imagina eu falar pro cara que ele tem que mover a seta até o primeiro para voltar ao campo anterior ? Se bem que pra isso, eu tambem teria que quebrar a cabeça para descobrir como fazer com que o listbox reconheça que o usuario está no primeiro item, apesar de achar que isso é possível pelo que estudei do listbox até agora. Tambem tem o "problema" de quando a lista está aberta, se o usuário teclar ESC, a edição de todos os gets é simplesmente abortada. Nesse caso, tambem teria que desabilitar a tecla ESC quando a lista estiver aberta. Resumindo: como disse, apenas criei um achoice normal e agora posso navegar tranquilamente entre os gets.

Obs.: preferí não alterar meu getsys visto que a solução com o achoice resolveu o problema plenamente.

[]s.

Ademir

Navegação de gets usando gets comuns e com listbox

Enviado: 27 Jun 2008 10:55
por Pablo César
fazer a saida do listbox para o get anterior com as setas achei meio complicado, pra não dizer inviavel. Imagine um listbox com 50 itens.
Pois é, visto por esse ângulo... realmente fica esquisito e desnecessário. Eu mencionei meu exemplo porque a quantidade de elemento a escolher eram fixa, por exemplo: SIM e NÃO.

Mas acho que valeu todos os comentários, pois ajudaram a compor um conceito sobre saída dos LISTBOX.

Re: Navegação de gets usando gets comuns e com listbox

Enviado: 01 Jul 2008 13:57
por rochinha
Amiguinho

tente usar esta solução:

Código: Selecionar todos

...
LinSAY := 10
ColSAY := 10
             @  LinSAY, ColSAY SAY "Cidade..:" GET M->CIDADE PICTURE "@!@K"              WHEN SAYIT( 'Digite o CIDADE.' );
                                   VALID IIF(!EMPTY(M->CIDADE),.T.,EDIT_PESQ(LinSAY, ; // Linha do box
                                   ColSAY,                          ; // Coluna do box
                                   M->CIDADE,                   ; // dado passado para pesquisa
                                   "CIDADE",                    ; // base de dados pesquisada
                                   1,                           ; // ordem do indice
                                   "CIDADE",                    ; // campo com conteudo retornado
                                   "CIDADE+'|'+ESTADO+'|'+DDD", ; // cabecalho do box
                                   "M->CIDADE",                 ; // variavel de retorno
                                   {|| .T. }))
...
Funcao EDIT_PESQ()

Código: Selecionar todos

#include "NF.CH"
#include "NFMOU.CH"
#include "NFERROR.CH"

FUNCTION EDIT_PESQ( M_LIN, M_COL, M_RELACAO, M_AREA, M_ORDEM, M_CAMPO, M_STRING, M_SAIDA, M_FUNCAO, M_LISTA, M_ELISTA )
IF M_LISTA = NIL; M_LISTA := .T.; ENDIF
SET KEY 22 TO
PUBLIC M_CAMPO2, M_EDLISTA, RET_CAMPO, M_RELAC2, M_LIN2, M_COL2, TA_MA_NHO
M_LIN2   := M_LIN
M_COL2   := M_COL
M_RELAC2 := ALLTRIM(M_RELACAO)
M_CAMPO2 := M_CAMPO
M_EDLISTA := IIF(M_ELISTA=NIL,.F.,M_ELISTA)
//M_LIN := BLA1
//M_COL := BLA2
//M_LIN := GETFLDROW()
//M_COL := GETFLDCOL()
IF M_LISTA = .F. // Se limitar a uma lista analisa conteudo dos campos
   IF VALTYPE( M_RELACAO ) = 'C'
      IF VAL(M_RELACAO) <> 0 .OR. EMPTY(M_RELACAO)
         M_LISTA := .T. // Se o campo caracter nao estiver VAZIO, lista
      ENDIF
   ENDIF
   IF VALTYPE( M_RELACAO ) = 'N'
      IF M_RELACAO <> 0
         M_LISTA := .T. // Se o campo numerico nao estiver com ZERO, lista
      ENDIF
   ENDIF
ENDIF
IF M_LISTA = .T. // Se limita somente a lista teste o tipo
   DECLARE M_CAMPOS[1]
   M_CAMPOS[1] := M_STRING
   U_AREATUA := ALLTRIM( STR( SELECT(), 3 ) ) // pega area atual
   U_ORDEM   := INDEXORD()                    // pega ordem atual
   SELE &M_AREA                               // seleciona area de pesquisa
   SET ORDER TO M_ORDEM                       // coloca nova ordem
   M_REC := RECCO()
   IF M_REC = 0
      BEEP(); MENSAGEM('Esta tabela esta VAZIA!!!',5)
      RETURN .F.
   ENDIF
   IF (M_LIN+1+8) > MAXROW()
      M_LIN  := M_LIN-11
   ENDIF
   IF (M_COL+LEN(&M_STRING)+1) > MAXCOL()
      M_COL  := MAXCOL()-(LEN(&M_STRING)+2)
   ENDIF
   SET SOFTSEEK ON
   SEEK M_RELACAO                             // pesquisa dado
   IF !FOUND()
      IF EMPTY(M_RELACAO)
         GO TOP
      ENDIF
      MOUSE( DESLIGA )
      SAVE SCREEN TO M->T_ELA
      MOUSE( LIGA )
      COR( "JANELA DE DIALOGO" )
      TA_MA_NHO := IIF(M_REC>7,7,M_REC)
      @ M_LIN+1,M_COL CLEAR TO M_LIN+2+2+TA_MA_NHO,M_COL+LEN(&M_STRING)+1
      @ M_LIN+1,M_COL       TO M_LIN+2+2+TA_MA_NHO,M_COL+LEN(&M_STRING)+1
      IF M_EDLISTA
         MENSAGEM("INSere DELeta ESCape")
      ENDIF
      @ M_LIN2+2+TA_MA_NHO, M_COL2+1 SAY REPL('-',LEN(&M_STRING))
      DBEDIT(M_LIN+2,M_COL+1,M_LIN+1+TA_MA_NHO,M_COL+LEN(&M_STRING),M_CAMPOS,"F_PESQ",'','','')
      MOUSE( DESLIGA )
      RESTORE SCREEN FROM M->T_ELA
      MOUSE( LIGA )
      COR( "GETS" )
   ENDIF
   RETORNO  := &M_CAMPO
   &M_SAIDA := RETORNO
   SET SOFTSEEK OFF
   EVAL( M_FUNCAO )
   SELE &U_AREATUA                            // seleciona antiga area
   SET ORDER TO U_ORDEM                       // seleciona antiga ordem
ENDIF
RETURN .T.

FUNCTION F_PESQ
PARAMETERS MODO, PONTEIRO
PRIVATE POS_CURSOR,REGISTRO
POS_CURSOR = ROW()
DO CASE
   CASE MODO < 4
        RETORNO = 1
   CASE LASTKEY() = 27 .OR. LASTKEY() = 13
        RETORNO  = 0
   CASE LASTKEY() = 21 .or. LASTKEY() =  7
        IF M_EDLISTA
           REGLOCK
           dbDELETE()
           COMMIT
        ENDIF
        RETORNO = 2
   CASE LASTKEY() = 22 .or. LASTKEY() = 14
        IF M_EDLISTA
           SAVE GET TO ED_LISTA
           M->RET_CAMPO := &M_CAMPO2
           @ POS_CURSOR,COL() GET M->RET_CAMPO PICT "@!"
           SET CURSOR ON
           READ
           SET CURSOR OFF
           RESTORE GET FROM ED_LISTA
           APPEND BLANK
           REPLACE &M_CAMPO2 WITH M->RET_CAMPO
           COMMIT
           IF LASTKEY() = 27
              RETORNO = 2
           ENDIF
        ENDIF
        RETORNO = 2
   OTHERWISE
        RETORNO = 1
ENDCASE
RETURN(RETORNO)

FUNCTION PSQ_TAB2( LIN, COL, HISTORY, RE_TORNO, QUE_DADO )
   PRIVATE TELA1,OPCAO
   SAVE SCREEN TO TELA1
   POSF := ASCAN(HISTORY,QUE_DADO)
   TAMF := IIF(LEN(HISTORY)>10,10,LEN(HISTORY))+1
   LINF := IIF( (LIN+TAMF)>MAXROW(), MAXROW()-TAMF, LIN+TAMF )
   COLF := IIF( (COL+20) > 79      , 80-20      , COL+20 )
   @ LIN, COL CLEAR TO LINF, COLF 
   @ LIN, COL TO LINF, COLF 
   M->OPCAO := ACHOICE( LIN+1, COL+1, LINF-1, COLF-1, HISTORY,,, POSF )
   REST SCREEN FROM TELA1
   IF OPCAO = 0
      RETURN( .F. )
   ENDIF
   &RE_TORNO := UPPER(HISTORY[ M->OPCAO ])
   RETURN( .T. )
Funcao SAYIT()

Código: Selecionar todos

Function SayIT( cMsg )
   @ 24,0 say cMsg
   RETURN( .T. )

Re: Navegação de gets usando gets comuns e com listbox

Enviado: 02 Jul 2008 08:06
por labaroazul
Ademir,

Sei que você quer reduzir código no .prg, mas abaixo coloquei uma soluçãp que eu uso e que até agora funcionou comigo. Pode ser, então, que lhe seja útil!

Código: Selecionar todos

SET KEY -7 TO EMPGOP
DO WHILE .T.
                cNUMERO = SPACE(4)
                cNOME = SPACE(50)    
                cATIVO = SPACE(3)
                cPONTUAL = SPACE(4)
                cMATRICULA = SPACE(4)
                cENTREVISTA = SPACE(10)
                cADMISSAO = SPACE(10)
                cTIPOADM = SPACE(40)
                cCBO = SPACE(7)
                cCARGO = SPACE(40)
                cDEPTO = SPACE(20)
                cCATEGORIA = SPACE(40)
                nSALARIO = 0
                cFORMAPAGTO = SPACE(20)
                cBANCO = SPACE(50)
                cAGENCIA = SPACE(50)
                cCONTA = SPACE(50)
                cSINDICATO = SPACE(40)
                nTAXASOCIO = 0
                cCESTA = SPACE(3)
                cMESCESTA = SPACE(7)
                nVALETRANSP = 0
                nNOFILHOS = 0
                nNODEPEND = 0
                nPENSAO = 0
                cPENSOBRE = SPACE(20)
                cPENBANCO = SPACE(50)
                cPENAGENCIA = SPACE(50)
                cPENCONTA = SPACE(50)
                cPENTITULAR = SPACE(50)
                cDEMISSAO = SPACE(10)
                cTIPODEM = SPACE(40)
                cNASCIMENTO = SPACE(10)
                cLOCAL = SPACE(30)
                cNACIONALID = SPACE(20)
                cRACA = SPACE(20)
                cPELE = SPACE(20)
                cOLHOS = SPACE(20)
                cCABELOS = SPACE(20)
                cBARBA = SPACE(3)
                cBIGODE = SPACE(3)
                cDEFICIENTE = SPACE(3)
                cTIPODEF = SPACE(10)
                cSEXO = SPACE(9)
                cNOMEPAI = SPACE(40)
                cNACIOPAI = SPACE(20)
                cNOMEMAE = SPACE(40)
                cNACIOMAE = SPACE(20)
                cESTCIVIL = SPACE(10)
                cCONJUGE = SPACE(50)
                cINSTRUCAO = SPACE(40)
                cRG = SPACE(20)
                cCPF = SPACE(20)
                cTITELEITOR = SPACE(20)
                cRESERVISTA = SPACE(20)
                cCTPSNO = SPACE(5)
                cCTPSSERIE = SPACE(3)
                cCTPSUF = SPACE(2)
                cPISPASEP = SPACE(20)
                cHABILITACA = SPACE(20)
                cENDERECO = SPACE(50)
                cBAIRRO = SPACE(40)  
                cCEP = SPACE(9)      
                cCIDADE = SPACE(40)  
                cUF = SPACE(2)       
                cTEL = SPACE(50)
                cCEL = SPACE(50)
                cFAX = SPACE(50)
                cEMAIL = SPACE(50)
                cDOM_ENTR1 = "00:00"
                cDOM_SAID1 = "00:00"
                cDOM_ENTR2 = "00:00"
                cDOM_SAID2 = "00:00"
                cSEG_ENTR1 = "00:00"
                cSEG_SAID1 = "00:00"
                cSEG_ENTR2 = "00:00"
                cSEG_SAID2 = "00:00"
                cTER_ENTR1 = "00:00"
                cTER_SAID1 = "00:00"
                cTER_ENTR2 = "00:00"
                cTER_SAID2 = "00:00"
                cQUA_ENTR1 = "00:00"
                cQUA_SAID1 = "00:00"
                cQUA_ENTR2 = "00:00"
                cQUA_SAID2 = "00:00"
                cQUI_ENTR1 = "00:00"
                cQUI_SAID1 = "00:00"
                cQUI_ENTR2 = "00:00"
                cQUI_SAID2 = "00:00"
                cSEX_ENTR1 = "00:00"
                cSEX_SAID1 = "00:00"
                cSEX_ENTR2 = "00:00"
                cSEX_SAID2 = "00:00"
                cSAB_ENTR1 = "00:00"
                cSAB_SAID1 = "00:00"
                cSAB_ENTR2 = "00:00"
                cSAB_SAID2 = "00:00"
                cDIADSR = SPACE(3)
                cVALORDSR = SPACE(5)
                cNOTA01 = SPACE(76)
                cNOTA02 = SPACE(76)
                cNOTA03 = SPACE(76)
                cNOTA04 = SPACE(76)
SETCOLOR("B/W")
CLEAR SCREEN
SET CURSOR ON
@ 02,01 SAY "NUMERO: "
@ 02,14 SAY "NOME: "
@ 03,01 SAY "ATIVO?" + CHR(31)
@ 03,12 SAY "MATRICULA: "
@ 03,28 SAY "PONTO ELETRONICO: "
@ 03,51 SAY "ENTREVISTA: "
@ 04,01 SAY "ADMISSAO: "
@ 04,22 SAY "TIPO:" + CHR(31)
@ 05,01 SAY "C.B.O.: "
@ 05,17 SAY "CARGO: "
@ 06,01 SAY "DEPTO: "
@ 06,29 SAY "CATEG:" + CHR(31)
@ 07,01 SAY "SALARIO: "
@ 07,21 SAY "FORMA DE PAGAMENTO:" + CHR(31)
@ 09,00 TO 13,79
@ 09,01 SAY "DADOS BANCARIOS PARA DEPOSITO EM CONTA"
@ 10,01 SAY "BANCO: "
@ 11,01 SAY "AGENCIA: "
@ 12,01 SAY "CONTA: "
@ 15,01 SAY "SINDICATO:" + CHR(31)
@ 15,53 SAY "TAXA SOCIO: "
@ 17,01 SAY "RECEBE CESTA BASICA?" + CHR(31)
@ 17,26 SAY "CESTA BASICA A RECEBER: "
@ 19,01 SAY "VALE TRANSPORTE (INFORMAR VALOR POR DIA, IDA + VOLTA): "
@ 21,01 SAY "DEMISSAO: "
@ 21,22 SAY "MOTIVO:" + CHR(31)

@ 02,09 GET cNUMERO PICTURE "@!" SEND COLORSPEC := "N/W,W+/N"
@ 02,20 GET cNOME PICTURE "@!"  SEND COLORSPEC := "N/W,W+/N"
@ 03,08 GET cATIVO PICTURE "@!" SEND COLORSPEC := "N/W,W+/N"
@ 03,23 GET cMATRICULA PICTURE "@!" SEND COLORSPEC := "N/W,W+/N"
@ 03,46 GET cPONTUAL PICTURE "@!" SEND COLORSPEC := "N/W,W+/N"
@ 03,63 GET cENTREVISTA PICTURE "99/99/9999" SEND COLORSPEC := "N/W,W+/N"
@ 04,11 GET cADMISSAO PICTURE "99/99/9999" SEND COLORSPEC := "N/W,W+/N"
@ 04,28 GET cTIPOADM PICTURE "@!" SEND COLORSPEC := "N/W,W+/N"
@ 05,09 GET cCBO PICTURE "@!" SEND COLORSPEC := "N/W,W+/N"
@ 05,24 GET cCARGO PICTURE "@!" SEND COLORSPEC := "N/W,W+/N"
@ 06,08 GET cDEPTO PICTURE "@!" SEND COLORSPEC := "N/W,W+/N"
@ 06,36 GET cCATEGORIA PICTURE "@!" SEND COLORSPEC := "N/W,W+/N"
@ 07,10 GET nSALARIO PICTURE "@E 9999999.99" SEND COLORSPEC := "N/W,W+/N"
@ 07,41 GET cFORMAPAGTO PICTURE "@!" SEND COLORSPEC := "N/W,W+/N"
@ 10,08 GET cBANCO PICTURE "@!" SEND COLORSPEC := "N/W,W+/N"
@ 11,10 GET cAGENCIA PICTURE "@!" SEND COLORSPEC := "N/W,W+/N"
@ 12,08 GET cCONTA PICTURE "@!" SEND COLORSPEC := "N/W,W+/N"
@ 15,12 GET cSINDICATO PICTURE "@!" SEND COLORSPEC := "N/W,W+/N"
@ 15,65 GET nTAXASOCIO PICTURE "@E 9999999.99" SEND COLORSPEC := "N/W,W+/N"
@ 17,22 GET cCESTA PICTURE "@!" SEND COLORSPEC := "N/W,W+/N"
@ 17,50 GET cMESCESTA PICTURE "99/9999" SEND COLORSPEC := "N/W,W+/N"
@ 19,56 GET nVALETRANSP PICTURE "@E 9999999.99" SEND COLORSPEC := "N/W,W+/N"
@ 21,11 GET cDEMISSAO PICTURE "99/99/9999" SEND COLORSPEC := "N/W,W+/N"
@ 21,30 GET cTIPODEM PICTURE "@!" SEND COLORSPEC := "N/W,W+/N"
READ
IF LASTKEY() = 27
    EXIT
ENDIF
ENDDO
SET COLOR TO
CLEAR SCREEN
RETURN

FUNCTION EMPGOP
LOCAL aOPCAO := {}
LOCAL nOPCAO
LOCAL nATUAL
LOCAL cEMPGTEL := SAVESCREEN(00,00,24,79)
LOCAL cEMPGCOR := SETCOLOR()
IF READVAR() = LEFT("CATIVO",10)
    AADD(aOPCAO,"SIM")
    AADD(aOPCAO,"NAO")
    SETCOLOR("W+/B,W+/N")
    @ 03,08 CLEAR TO 06,12
    DBGSHADOW(03,08,06,12)
    @ 03,08 TO 06,12
    nOPCAO = ACHOICE(04,09,05,11,aOPCAO)
    IF nOPCAO <> 0
        cATIVO = aOPCAO[nOPCAO]
    ENDIF
ELSEIF READVAR() = LEFT("CTIPOADM",10)
    AADD(aOPCAO,"10-PRIMEIRO EMPREGO                     ")
    AADD(aOPCAO,"20-EMPREGO ANTERIOR / REEMPREGO         ")
    AADD(aOPCAO,"25-CONTRATO POR PRAZO DETERMINADO       ")
    AADD(aOPCAO,"35-REINTEGRACAO                         ")
    AADD(aOPCAO,"70-TRANSFERENCIA DE ENTRADA             ")
    SETCOLOR("W+/B,W+/N")
    @ 04,28 CLEAR TO 09,69
    DBGSHADOW(04,28,09,69)
    @ 04,28 TO 09,69
    nOPCAO = ACHOICE(05,29,08,68,aOPCAO)
    IF nOPCAO <> 0
        cTIPOADM = aOPCAO[nOPCAO]
    ENDIF
ELSEIF READVAR() = LEFT("CFORMAPAGTO",10)
    AADD(aOPCAO,"01-MENSAL           ")
    AADD(aOPCAO,"02-QUINZENAL        ")
    AADD(aOPCAO,"03-SEMANAL          ")
    AADD(aOPCAO,"04-DIARIO           ")
    AADD(aOPCAO,"05-POR HORA         ")
    AADD(aOPCAO,"06-POR TAREFA       ")
    AADD(aOPCAO,"07-POR PECA         ")
    AADD(aOPCAO,"08-POR AULA         ")
    SETCOLOR("W+/B,W+/N")
    @ 07,41 CLEAR TO 12,63
    DBGSHADOW(07,41,12,63)
    @ 07,41 TO 12,63
    nOPCAO = ACHOICE(08,42,11,62,aOPCAO)
    IF nOPCAO <> 0
        cFORMAPAGTO = aOPCAO[nOPCAO]
    ENDIF
ELSEIF READVAR() = LEFT("CCESTA",10)
    AADD(aOPCAO,"SIM")
    AADD(aOPCAO,"NAO")
    SETCOLOR("W+/B,W+/N")
    @ 17,22 CLEAR TO 20,26
    DBGSHADOW(17,22,20,26)
    @ 17,22 TO 20,26
    nOPCAO = ACHOICE(18,23,19,25,aOPCAO)
    IF nOPCAO <> 0
        cCESTA = aOPCAO[nOPCAO]
    ENDIF
ELSEIF READVAR() = LEFT("CTIPODEM",10)
    AADD(aOPCAO,"00-SEM DEFINICAO                        ")
    AADD(aOPCAO,"31-DISPENSA SEM JUSTA CAUSA             ")
    AADD(aOPCAO,"32-DISPENSA POR JUSTA CAUSA             ")
    AADD(aOPCAO,"40-PEDIDO DE DEMISSAO                   ")
    AADD(aOPCAO,"43-FIM DE CONTRATO POR PRAZO DETERMINADO")
    AADD(aOPCAO,"45-TERMINO DE CONTRATO                  ")
    AADD(aOPCAO,"50-APOSENTADORIA                        ")
    AADD(aOPCAO,"60-FALECIMENTO                          ")
    AADD(aOPCAO,"80-TRANSFERENCIA DE SAIDA               ")
    SETCOLOR("W+/B,W+/N")
    @ 15,30 CLEAR TO 21,72
    DBGSHADOW(15,30,21,72)
    @ 15,30 TO 21,72
    nOPCAO = ACHOICE(16,31,20,71,aOPCAO)
    IF nOPCAO <> 0
        cTIPODEM = aOPCAO[nOPCAO]
    ENDIF
ENDIF
SET COLOR TO cEMPGCOR
CLEAR SCREEN
RESTSCREEN(00,00,24,79,cEMPGTEL)
RETURN(.T.)

Re: Navegação de gets usando gets comuns e com listbox

Enviado: 02 Jul 2008 12:59
por Ademir
Boa tarde !

Agradeço a cooperação de todos, mas acabei desistindo de usar o ListBox, visto que com a achoice consegui um efeito muito legal e parecido com o listbox. O exemplo abaixo mostra uma lista de UFs. Se a variavel for inicializada com SP por exemplo, ao pressionar F1 a lista se posiciona no item SP automaticamente.

Código: Selecionar todos

 
proc help(nomprog,numlin,nomvar)
loca opcant,telant:=savescreen(0,0,24,79),corant:=setcolor()
if nomvar#'ESTA_010V' .and. nomvar#'ESTA_060V' 
    retu
endi
vexnom={'AC','AL','AM','AP','BA','CE','DF','ES','GO','MA','MG','MS','MT','PA','PB','PE','PI','PR','RJ','RN','RO','RR','RS','SC','SE','SP','TO'}
janela(row()+1,col()-1,23,col()+2,'w+/rb,w+/bg')
opcant=achoice(row(),col(),22,col()+1,vexnom,,,ascan(vexnom,&nomvar))
&nomvar=if(opcant=0,&nomvar,vexnom[opcant])
restscreen(0,0,24,79,telant)
setcolor(corant)
retu