Página 1 de 1

PREENCHER GET COM P

Enviado: 11 Jul 2007 13:44
por Sergio_ASSilva
Olá Pessoal,


Algutem tem alguma fucao que complete o Get com a medida que a gente vai digitando as letras, um pouco doiferente da pesquisa letra a letra que vamos digitando e vai aparecendo os nomes e depois nos selecionamos com Ente.


Grato

Re: PREENCHER GET COM P

Enviado: 11 Jul 2007 16:27
por sygecom
Sergio_ASSilva escreveu:Olá Pessoal,


Algutem tem alguma fucao que complete o Get com a medida que a gente vai digitando as letras, um pouco doiferente da pesquisa letra a letra que vamos digitando e vai aparecendo os nomes e depois nos selecionamos com Ente.


Grato
Tche, essa é Boa, mas CLIPPER não é EXCEL...entaum acho que para isso que vc esta citando funcionar, vc vai ter que alterar o GETSYS.PRG...agora como alterar e onde alterar eu não sei pq nunca mexi no GETSYS.PRG...se quiser dar uma olhada em um exemplo que adptei para tbrowse do letra a letra pode baixar no link abaixo:
http://www.sygecom.com.br/xharbour/letra_a_letra.zip

Abraços
Leonardo Machado

Enviado: 11 Jul 2007 17:00
por Maligno
Se for pra fazer uma caixa de edição como nos programas Windows, nem mesmo alterando a GETSYS pra dar jeito, já que nela o controle de edição é feito pelos pseudo-objetos da classe GET. Teria de ser feito outro GETSYS, mas sem o uso dessa classe; implementando tudo na unha.

Enviado: 11 Jul 2007 19:31
por Augusto
Pessoal... eu posso até estar falando alguma besteira... mais até onde eu sei, o "efeito" que o parceiro quer implementar, semelhante ao "auto-completar" do Excel ou até mesmo do OutLook entre outros, só é possível prq a rotina invoca uma base de dados (digamos assim) que guarda em bytes as últimas "x" entradas via teclado daquela máquina...

Talvez, se quizessemos implementar algo parecido em Clipper, o caminho (lógica/algorítimo) seja esse...

Enviado: 11 Jul 2007 19:46
por Maligno
A lógica é mais ou menos essa. Os dados podem residir num buffer pra facilitar o trabalho, da mesma forma que se faz num combo box qualquer em Windows. Mas o problema está em implementar isso no GETLIST. De forma nativa, só com os métidos da classe GET não dá pra fazer.

Enviado: 12 Jul 2007 08:05
por Sergio_ASSilva
Obrigado a todos pela atenção.

Enviado: 12 Jul 2007 09:37
por Zoc
Sergio,

Se o campo que vai preencher for indexado, dá para usar a rotina abaixo:

Código: Selecionar todos

cNOME = space(40)
@ 10,10 GET cNOME    PICT "@!""  WHEN BUSCANOME()
READ


// Faça alterações necessária para adequar ao seu programa
// A alteração será no indice, nas cores e nas coordenadas do get
/////////////////////////////
FUNCTION BUSCANOME
LOCAL tam, buf, get, pos, lin, col, tec, n_nsx
N_NSX := INDEXORD()
DBSETORDER(1)           // set order do seu indice
get := GETACTIVE()
lin := get:row
col := get:col
buf := get:VarGet()
tam := LEN(buf)
pos := 1
SETCOLOR("w+/b")
@ 10,10 CLEAR TO 10,49     // coordenadas do seu get
DO WHILE .T.
   @ 10,10 CLEAR TO 10,49    // coordenadas do seu get
   SETPOS(lin, col)
   DISPOUT(buf)
   SETCOLOR("w+/b")
   SET COLOR TO W+/R
   SETPOS(lin, col - 1 + pos)
   tec := INKEY(0)
   IF tec >= 32 .AND. tec <= 255
      TEC := ASC( UPPER( CHR( TEC )))
      buf := LEFT(buf, pos - 1) + CHR(tec) + SUBS(buf, pos + 1)
      IF DBSEEK(LEFT(buf, pos), .T.)
         buf := LEFT(&(INDEXKEY(0)), tam)
      ELSE
         buf := LEFT(buf, pos) + SPACE( TAM - POS)
      ENDIF
      pos := MIN(tam, pos + 1)
   ELSEIF tec == K_LEFT
      pos := MAX(1, pos - 1)
   ELSEIF tec == K_RIGHT
      pos := MIN(tam, pos + 1)
   ELSEIF tec == K_HOME
      pos := 1
   ELSEIF tec == K_END
      pos := MIN(tam, LEN(TRIM(buf)) + 1)
   ELSEIF tec == K_BS
      IF pos > 1
         pos --
         buf := LEFT(buf, pos - 1) + SUBS(buf, pos + 1) + " "
      ENDIF
   ELSE
      KEYB CHR(tec)
      get:VarPut(buf)
      get:UpdateBuffer()
      DBSETORDER( N_NSX )
      RETURN .T.
   ENDIF
ENDDO
[/code]

Enviado: 12 Jul 2007 10:33
por janio
Rapaz,

Eu acho que tenho uma função que faz isso! Peguei em algum site, mas não lembro em qual...

Quando eu chegar em casa vou olhar se encontro, valeu?

Jânio

Enviado: 12 Jul 2007 14:43
por Sergio_ASSilva
Perfeitamente Zoc!!


Era esta rotina que eu queria. Fiz as mudancas e funcionou legal.

Obrigado

BUSCAR NOME

Enviado: 14 Jul 2007 09:22
por Netavin
Bom dia Zoc !!
Colega, achei interessantíssimo sua rotina. Tentei implementá-la. Porém o programa informa que não existe a variável K_LEFT. Tenho que inicializá-la primeiro ??

Grato!

Netavin

Re: BUSCAR NOME

Enviado: 14 Jul 2007 10:08
por Maligno
Netavin escreveu:o programa informa que não existe a variável K_LEFT. Tenho que inicializá-la primeiro ??
Esse é o código da tecla seta à esquerda. Basta incluir o header INKEY.CH no seu programa.

GET

Enviado: 16 Jul 2007 19:50
por Netavin
... valeu amigo Malígno !!!
Como não pensei nisso antes de escrever ..!?
Desculpe-me!!
Sinceros agradecimentos!

[]´s

Netavin.

Re: GET

Enviado: 16 Jul 2007 20:22
por Maligno
Netavin escreveu:... valeu amigo Malígno !!!
Como não pensei nisso antes de escrever ..!?
São os pequenos detalhes que fazem a diferença. Eu sofro com esse tipo de esquecimento o tempo todo com C e C++, que são linguagens altamente dependentes de headers. O remédio pra isso é desconfiar sempre. Faça como eu faço. Eu sempre me digo coisas do tipo: "Aposto que vai dar errado.", "Deu certo! Mas deve ter algo errado!". :)))
Desculpe-me!!
Não tem do que se desculpar. Isso acontece. :)

Enviado: 17 Jul 2007 09:27
por Pablo César
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.

Enviado: 17 Jul 2007 09:44
por Stanis Luksys
Olá,

Se não me engano no Clipper 5.3 já existem prontas as classes para listbox e combobox... Eu também prefiro usar um TBrowse mas conforme for até um achoice poderia ser implementado, vai da criatividade... Se tiver interesse nas classes mencionadas é só dar uma olhadinha no NG.

Falou!