O exemplo que o colega Zoc deu, acho que resolveu. Mas gostaria de adicionar um exemplo que eu tenho no cadastro de clientes, onde cadastra-se a empresa onde trabalha. Este exemplo servirá para demostrar a exibição da empresa fora do focus do GET onde o usuário digita (aparecendo a sugestão ao estilo Windows). Fiz esta função para que o usuário não precise digitar muito, consultando um BD de empresas da qual tiro proveito para mala-direta. Portanto não permito que haja duplicidade de registros. A procura da empresa é em modo FANTASIA, isto é, o nome reduzido ou nome mais conhecido da empresa. Mesmo que no meu exemplo abaixo eu tenha colocado poucos campos (para facilitar compreensão), nesse BD daria para acrescentar outros campos como endereço, telefone, CNPJ, etc. Neste exemplo também pode ser utilizado para corregir certos tipos de erros cometido pelo usuário. Por exemplo colocar "APOSENTADO" como nome da empresa.
Código: Selecionar todos
SETCOLOR("N/W")
CLS
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" }
IF !FILE("EMPRESAS.DBF")
CRIARQS()
ENDIF
SELE 4
USE EMPRESAS INDEX EMPRE001,EMPRE003
V_EMP:=SPACE(20)
V_COD_EMP:=1
TELA_TRAB=SAVESCREEN(14,05,17,78)
@ 13,08 SAY " Local de Trabalho.....:"
@ 13,33 SAY V_EMP COLOR CONTECOR[8]
@ 13,82 GET V_COD_EMP PICT "9999" WHEN MUDA_EMP(V_COD_EMP)
READ
@ 14,08 SAY " Codigo da Empresa.....: "+STRZERO(V_COD_EMP,6,0)
FUNCTION MUDA_EMP(V_COD_EMP,XMSG)
// MENSAGEM("Digite o nome da empresa onde trabalha")
SET CURSOR ON
VP=1
VQL1=ROW()
VQC1=COL()
VX1=13
VY1=33
IF V_COD_EMP=0
V_EMP=SPACE(20)
ELSE
SELE 4
SET ORDER TO 1
SEEK STRZERO(V_COD_EMP,4,0)
IF FOUND()
V_EMP=(4->FANTASIA)
ELSE
V_EMP=SPACE(20)
ENDIF
ENDIF
VT=LEN(V_EMP)
DECLARE LETRAS[VT]
FOR VI=1 TO VT
LETRAS[VI]:=SUBSTR(V_EMP,VI,1)
NEXT
@ VX1,VY1 SAY V_EMP COLOR CONTECOR[9]
@ VX1,VY1-1+VP SAY "" COLOR CONTECOR[9]
DO WHILE .T.
PASS=''
FOR VI=1 TO VT
PASS=PASS+LETRAS[VI]
NEXT
IF LEN(ALLTRIM(PASS))>2
SELE 4
SET ORDER TO 2
SEEK ALLTRIM(PASS)
IF FOUND()
RESTSCREEN(14,05,17,78,TELA_TRAB)
VTAM=LEN(ALLTRIM(PASS))
@ 14,30+VTAM TO 16,VTAM+31+LEN(ALLTRIM(4->FANTASIA)) COLOR CONTECOR[4]
@ 15,31+VTAM SAY ALLTRIM(4->FANTASIA) COLOR CONTECOR[4]
SOMBRA(14,30+VTAM,16,VTAM+31+LEN(ALLTRIM(4->FANTASIA)))
ELSE
RESTSCREEN(14,05,17,78,TELA_TRAB)
ENDIF
ELSE
RESTSCREEN(14,05,17,78,TELA_TRAB)
ENDIF
@ VX1,VY1-1+VP SAY "" COLOR CONTECOR[9]
CODI=INKEY(0)
IF CODI=0
LOOP
ELSEIF CODI=25 // Ctrl-Y
VP=1
AFILL(LETRAS,SPACE(1))
FOR VI=VP TO VT
@ VX1,VY1-1+VI SAY LETRAS[VI] COLOR CONTECOR[9]
NEXT
LOOP
ELSEIF CODI=8 .AND. VP>1 // Backspace, Ctrl-H
VP=VP-1
ADEL(LETRAS,VP)
LETRAS[VT]=SPACE(1)
FOR VI=VP TO VT
@ VX1,VY1-1+VI SAY LETRAS[VI] COLOR CONTECOR[9]
NEXT
ELSEIF CODI=8 .AND. VP=1
LOOP
ELSEIF CODI=19 .AND. VP>1 .AND. VP<=VT // Left arrow, Ctrl-S
@ VX1,VY1-1+VP SAY LETRAS[VP] COLOR CONTECOR[9]
VP=VP-1
LOOP
ELSEIF CODI=7 // Del, Ctrl-G
ADEL(LETRAS,VP)
LETRAS[VT]:=" "
FOR VI=VP TO VT
@ VX1,VY1-1+VI SAY LETRAS[VI] COLOR CONTECOR[9]
NEXT
ELSEIF CODI=5 // Up
KEYBOARD CHR(5)
EXIT
ELSEIF CODI=24 // Down
KEYBOARD CHR(24)
EXIT
ELSEIF CODI=18 .OR. CODI=3 .OR. CODI=26 .OR. CODI=2 .OR. CODI=29 .OR. CODI=23 .OR. CODI=31 .OR. CODI=30 .OR. CODI=10 .OR. CODI=9 .OR. CODI=28 .OR. CODI<0
EXIT
ELSEIF CODI=6 // End, Ctrl-F
PASS=''
FOR VI=1 TO VT
PASS=PASS+LETRAS[VI]
NEXT
IF LEN(RTRIM(PASS))=20
VP=LEN(RTRIM(PASS))
ELSE
VP=LEN(RTRIM(PASS))+1
ENDIF
@ VX1,VY1-1+VP SAY LETRAS[VP] COLOR CONTECOR[9]
RELEASE VI,PASS
LOOP
ELSEIF CODI=22 // Ins, Ctrl-V
IF READINSERT()=.T.
READINSERT(.F.)
SETCURSOR(1)
ELSE
READINSERT(.T.)
SETCURSOR(3)
ENDIF
LOOP
ELSEIF CODI=1 // Home, Ctrl-A
VP=1
@ VX1,VY1-1+VP SAY LETRAS[VP] COLOR CONTECOR[9]
LOOP
ELSEIF CODI=19 .AND. VP=1
LOOP
ELSEIF CODI=4 .AND. VP<=VT // Right arrow, Ctrl-D
@ VX1,VY1-1+VP SAY LETRAS[VP] COLOR CONTECOR[9]
VP=VP+1
ELSEIF CODI=13
PASS=''
FOR VI=1 TO VT
PASS=PASS+LETRAS[VI]
NEXT
IF VPROFIS(PASS)=.T.
EXIT
ENDIF
ELSEIF CODI=27
FOR VI=1 TO VT
LETRAS[VI]:=SUBSTR(V_EMP,VI,1)
NEXT
EXIT
ELSE
IF READINSERT()=.T.
AINS(LETRAS,VP)
LETRAS[VP]:=UPPER(CHR(CODI))
FOR VI=VP TO VT
@ VX1,VY1-1+VI SAY LETRAS[VI] COLOR CONTECOR[9]
NEXT
ELSE
LETRAS[VP]=UPPER(CHR(CODI))
@ VX1,VY1-1+VP SAY UPPER(CHR(CODI)) COLOR CONTECOR[9]
ENDIF
VP=VP+1
ENDIF
IF VP>VT
EXIT
ENDIF
ENDDO
IF LASTKEY()=13
PASS=''
FOR VI=1 TO VT
PASS=PASS+LETRAS[VI]
NEXT
@ VQL1,VQC1 SAY ""
IF !EMPTY(ALLTRIM(PASS))
SELE 4
SET ORDER TO 2
SEEK ALLTRIM(PASS)
IF FOUND()
V_COD_EMP=(4->COD_EMP)
ELSE
V_COD_EMP=SEQ_PEGA() // Procura numero sequencial (exemplo)
SELE 4
IF RLOCK()
REPLACE COD_EMP WITH V_COD_EMP, FANTASIA WITH PASS
UNLOCK
ENDIF
ENDIF
VRET=STRZERO(V_COD_EMP,4,0)
ELSE
VRET=REPLICATE("0",4)
ENDIF
ELSE
VRET=STRZERO(V_COD_EMP,4,0)
ENDIF
KEYBOARD VRET
RELEASE LETRAS,VT,VP,VI,VX1,VY1
RELEASE VQL1,VQC1,CODI
RESTSCREEN(14,05,17,78,TELA_TRAB)
SELE 1
RETURN .T.
FUNCTION VPROFIS(PASS)
DO CASE
CASE "DO LAR" $ PASS
VRET=.F.
CASE "APOSENTAD" $ PASS
VRET=.F.
CASE "PEDREIR" $ PASS
VRET=.F.
CASE "GUARDA" $ PASS
VRET=.F.
CASE "CABELEIREIR" $ PASS
VRET=.F.
CASE "TRABALHANDO" $ PASS
VRET=.F.
CASE "GERENTE" $ PASS
VRET=.F.
CASE "GERENCIA" $ PASS
VRET=.F.
CASE "PROPRIETARI" $ PASS
VRET=.F.
CASE "ESTUDANTE" $ PASS
VRET=.F.
CASE "PENSIONISTA" $ PASS
VRET=.F.
CASE "RESERVISTA" $ PASS
VRET=.F.
CASE "TAXISTA" $ PASS
VRET=.F.
CASE "OPERADOR" $ PASS
VRET=.F.
CASE "AUXILIAR" $ PASS
VRET=.F.
CASE "MOTORISTA" $ PASS
VRET=.F.
CASE "ELETRICISTA" $ PASS
VRET=.F.
CASE "PADEIRO" $ PASS
VRET=.F.
CASE "LOJISTA" $ PASS
VRET=.F.
CASE "POR CONTA" $ PASS
VRET=.F.
CASE "EMPRESARIO" $ PASS
VRET=.F.
CASE "AUTONOM" $ PASS
VRET=.F.
CASE "RETIRAD" $ PASS
VRET=.F.
CASE "DESEMPREGAD" $ PASS
VRET=.F.
CASE "DOMESTIC" $ PASS
VRET=.F.
CASE "EMPREGAD" $ PASS
VRET=.F.
OTHERWISE
VRET=.T.
ENDCASE
IF VRET=.F.
TONE( 250, 4 )
ALERT("Aten‡„o: Esta n„o ‚ nome de empresa.;Deixe em branco este campo e coloque como observa‡„o.")
ENDIF
RETURN VRET
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 SEQ_PEGA()
// Este exemplo de sequencial, nao ‚ aconselhado (fiz este para nao complicar)
VRET:=LASTREC()+1
RETURN VRET
FUNCTION CRIARQS()
CAMPOS:={{"COD_EMP" ,"N",010,000},;
{"EMPRESA" ,"C",036,000},;
{"FANTASIA","C",020,000} }
DBCREATE("EMPRESAS.DBF",CAMPOS)
SELE 4
USE EMPRESAS EXCLUSIVE
TEXT TO FILE("EMPRESAS.TXT" )
1,"SADIA TRADING S/A","SADIA"
2,"BANCO BRADESCO AGHH","BANCO BRADESCO"
3,"GRUPO BANDEIRAS DE TELEVISAO","BANDEIRANTES"
4,"BANCO DO ESTADO DE SAO PAULO","BANCO BANESPA"
ENDTEXT
APPEND FROM EMPRESAS.TXT DELI
GOTO 1
DELE
PACK
INDEX ON STRZERO(COD_EMP,4,0) TO EMPRE001
INDEX ON FANTASIA TO EMPRE003
CLOSE 4
RETURN NIL
O exemplo acima pode ser compilado que irá criar um arquivo DBF e NTX para sua funcionabilidade. Digite como exemplo a palavra "BAN" e irá aparecer o primeiro banco cadastrado mas se digitar "BAND" irá muda para BANDEIRANTES, também pode ser testado com a palavra "SAD".
Cabe lembrar a você que caso haja necessidade de cadastrar nova empresa o sistema acatará ao confirmar com <ENTER>.
Bem, espero que gostem e tenha servidor para outros propósitos também.