Página 1 de 1

Preciso dar um "CLEA" no inkey/lastkey...

Enviado: 09 Jun 2010 20:23
por lugab
Boa noite, amigos. Vejam essas simples linhas do meu código, pois ela está errada.

Filtro=""
set key -3 to SNomes
@ 10,10 get Tcod pict "99" valid Tcod>0
read
set key -3 to
if lastkey()=27
exit
Endif

O "Set key -3 to Snomes" carrega o Dbedit(). Caso o usuario não deseje trazer nenhum item do dbedit(), ele teclará [ESC] para abandonar o Dbedit() e retornar para o Get.

O problema é que o mesmo [ESC] que o usuário clica no Dbedit() , continua valendo para o GET do código (@ 10,10 get Tnome pict "@!" ) , então, o programa volta do Dbedit e automaticamnte cai no "if lastkey()=27" e encerra sozinho, via exit.

Meu desejo é que o [ESC] do Dbedit() não afete o meu Get e o usuário possa teclar outro Tcod.

Tem como evitar isso ?

Abaixo o trecho do Dbedit()

Código: Selecionar todos

*----------
Func SNomes
*----------
Sele VServ
Ordsetfocus(arqVServ1)
clea gets

Decl vet1[2]
     vet1[1]="Nome"
     vet1[2]="Cod"          
	  
Decl vet2[2]
     vet2[1]="@X"
     vet2[2]="99"          
     	  
Decl vet3[2]
     vet3[1]="Nome"
     vet3[2]="Cod"
     
Set key -3 to
If .not. empty(FILTRO)
   Set Filter to &Filtro
endif   
DbGoTop()

TelSalv=win(08, 2,21,77, "tabela Servicos" )
Item=Dbedit(08, 2,21,77,vet1,"extra",vet2,vet3,"Ä","³")
rstenv(TelSalv)
If lastkey()#27
   Tcod=Cod   
else
    Tcod=0
Endi

If .not. empty(FILTRO)
   VServ->(DbClearFilter())
Endif    
Filtro=""    

Ordsetfocus(arqVServ0)
Retu .t.
E Abaixo a rotina Extra()

Código: Selecionar todos

*--------------
Func Extra
*-------------
Para val_
IF VAL_=0
   RETU 1  
ENDI

If lastkey()=27 
   RETVAL=0
   
Elseif lastkey()=-1 
    Setcolor( "n/w,n*/w, , , n*/w" )
    TelSalv:=NBox(11,29,11,55,"w/r",.t.)  && .t. com sombra
    DO WHIL .T.
       Xdes=space(20)
       Setcolor( "n/w,n*/w, , , n*/w" )
       @ 11,29 clea to 11,55
       @ 11,29 SAY "Nome: " 
       @ 11,35 Get xdes pict '@x'
       read
       RstEnv(TelSalv)
       if lastkey()=27.or.empty(XDES)
          RETVAL=1
          DbGoTop()
          EXIT
       Elseif lastkey()=13
          SET SOFT ON
          SEEK UPPE(XDES)
          SET SOFT OFF
          RETVAL=2
          EXIT
       Endi
    Endd
    
Elseif lastkey()=13 .or. lastkey()=1024  && enter
      ITEM=RECN()
      GOTO ITEM
      RETVAL=0
Else
      RETVAL=1
ENDI

Retu retval
Agradeço a quem dispor de tempo e condições de ajudar,

Gabriel

Preciso dar um "CLEA" no inkey/lastkey...

Enviado: 09 Jun 2010 21:27
por Pablo César
O meu conselho Gabriel é que você passe a utilizar o TBROWSE em lugar do DBEDIT. Digo isto porque com o TBROWSE, você poderia ampliar seus conhecimentos, vetores, alguns conceitos de "objetos", e de adicionar maior funcionabilidade a procura de "nomes", ordenando-os por ordem alfabetica e localizando a medida que o usuário está digitando... Bom digo sito, porque o TBROWSE é sem dúvidas é mais flexivelk, permitindo fazer implementações na exibição dos dados em colunas. Faça uma pesquisa no forum pela palavra "tbrowse". Também você pode encontrar um exemplo de tbrowse e localização de registro a medida que o usuário digita, isso na seção de downloads (página principal do PCTOLEDO).
O problema é que o mesmo [ESC] que o usuário clica no Dbedit() , continua valendo para o GET do código (@ 10,10 get Tnome pict "@!" ) , então, o programa volta do Dbedit e automaticamnte cai no "if lastkey()=27" e encerra sozinho, via exit.
Eu não conseguí executar seu código em virtude de algumas funções estarem faltando: WIN,
RSTENV e NBOX. Além de faltar o DBF. Mas se quiser ainda persistir no DBEDIT, você poderia tentar adicionar um INKEY() logo antes da saída de função (onde é chamado o dbedit). Esse INKEY(), esvaziria o buffer logo ante de retornar ao get.

Re: Preciso dar um "CLEA" no inkey/lastkey...

Enviado: 09 Jun 2010 22:08
por lugab
Oi Pablo,
O meu conselho Gabriel é que você passe a utilizar o TBROWSE em lugar do DBEDIT.
Rapaz, usar esse Tbrowse era o meu sonho. Baixei vários exemplos, mas como eu sou muito fraco em linguagem de programação, não entendi patavinas dele. Já o Dbedit(), da pra qualquer semi-zero , tipo eu, entender.
Eu não conseguí executar seu código em virtude de algumas funções estarem faltando: WIN, RSTENV e NBOX.


WIN é o velho limpa a tela (acrescido de savescreen) , que limpa e salva atela ao mesmo tempo, antes da tela seguinte ser usada.

RSTENV é o velho Restscreen() e

NBOX (é a caixinha de box).

Todos eles podem ser retirados do exemplo, caso vc tenha tempo ai pra dar uma compilada.
Além de faltar o DBF.

O dbf só tem 2 campos: Cod (n,999) e Nome (x,20)

001LUIS GABRIEL
002LUIS SANTOS
você poderia tentar adicionar um INKEY() logo antes da saída de função (onde é chamado o dbedit). Esse INKEY(), esvaziria o buffer logo ante de retornar ao get.


Pablo, eu juro que coloquei o inkey() (sem nenhum valor dentro das aspas) logo após o retorno do Dbedit(), mas o miserável não esvaziou buffer nenhum.

O detalhe é que eu te omiti que compilo com Xharbour 1.00 e, certamente por isso, o inkey() não limpou coisa nenhuma. Vou experimentar o SETLASTKEY(), o CLEAR TYPEAHEAD e tudo o m ais que limpa buffers no harbour, pra ver...

Re: Preciso dar um "CLEA" no inkey/lastkey...

Enviado: 09 Jun 2010 22:26
por alaminojunior
Meu caro Luis Gabriel. Segue aí um post com um exemplo que postei explicando fácil fácil como usar o tbrowse() Bem simples e explicado.
https://pctoledo.org/forum/viewto ... wse#p52080

Re: Preciso dar um "CLEA" no inkey/lastkey...

Enviado: 09 Jun 2010 22:35
por lugab
Alumínio,kkk, obrigado pelo seu "easy-tbrowse()"

Quer saber ? Vou passar o mês todo olhando pra esse bicho, pra ver se ele deixa de ser tão feio. Se ele for "easy" mesmo , eu termino matando todas as charadas dele.

Grato,

Gabriel

Re: Preciso dar um "CLEA" no inkey/lastkey...

Enviado: 09 Jun 2010 22:47
por alaminojunior
Sou capaz de apostar que em menos de um dia você disseca ele.

Re: Preciso dar um "CLEA" no inkey/lastkey...

Enviado: 10 Jun 2010 09:26
por ANDRIL
Para limpar o buffer tenta implementar o keyboard no codigo conforme abaixo:

Código: Selecionar todos

If lastkey()#27
   Tcod=Cod   
else
    //--joga um HOME no teclado
    keyb chr(1)
    Tcod=0
Endi
ou se mesmo assim nao funcionar tente assim:

Código: Selecionar todos

If lastkey()#27
   Tcod=Cod   
else
   //--pausa temporariamente o teclado
   inkey(0.01)
   //--joga um HOME no teclado 
   keyb chr(1)
   Tcod=0
Endi
Eu tambem por falta de tempo, não estudei ainda a fundo o TBROWSE, continuo no DBEDIT que por vez, esta me servindo ainda bem.

Ate+

Re: Preciso dar um "CLEA" no inkey/lastkey...

Enviado: 10 Jun 2010 10:17
por gvc
[ANDRIL]
Dê uma olhada nas alterações que eu fiz no seu código.

Código: Selecionar todos

*----------
Func SNomes
*----------
Sele VServ
Ordsetfocus(arqVServ1)
clea gets

vet1 := {"Nome", "Cod"}
vet2 := {"@X", "99"}
vet3 := {"Nome", "Cod"}

Set key -3 to
If !empty(FILTRO)
   Set Filter to &Filtro
end
DbGoTop()

TelSalv := win(08, 2,21,77, "tabela Servicos" )
Item := Dbedit(08, 2,21,77, vet1, "extra", vet2, vet3, "Ä", "³")
rstenv(TelSalv)
Tcod := iif(lastkey() # 27, Cod, 0)

If !empty(FILTRO)
   VServ->(DbClearFilter())
End
Filtro := ""

Ordsetfocus(arqVServ0)
return(.t.)

*--------------
Func Extra(val_)
*-------------
local _as_ := lastkey()

if val_ = 0
   return(1)
elseif _as_ = 27
   keyboard ''
   retval := 0
elseif _as_ = -1
   setcolor( "n/w,n*/w, , , n*/w" )
   telsalv := nbox(11,29,11,55,"w/r",.t.)  && .t. com sombra
   while .T.
      xdes := space(20)
      setcolor( "n/w,n*/w, , , n*/w" )
      @ 11,29 clea to 11,55
      @ 11,29 SAY "Nome: "
      @ 11,35 get xdes pict '@x'
      read
      rstenv(telsalv)
      if lastkey() = 27 .or. empty(xdes)
         retval := 1
         dbgotop()
         keyboard ''
         exit
      elseif _as_ = 13
         dbseek(uppe(xdes), .T.)
         retval := 2
         exit
      end
   end
elseif _as_ = 13 .or. _as_ = 1024  && enter /// Não entendi!!! Se é só para mover o ponteiro de arquivo para o mesmo registro DBSKIP(0)
   item := recno()
   goto item
   keyboard ''
   retval := 0
else
    retval := 1
end

return(retval)

Re: Preciso dar um "CLEA" no inkey/lastkey...

Enviado: 10 Jun 2010 11:01
por lugab
Obrigado, Andril.

Sua sugestão abaixo funcionou redondo.

Código: Selecionar todos

//--pausa temporariamente o teclado
inkey(0.01)
//--joga um HOME no teclado 
keyb chr(1)
Tcod=0
Obrigado tb, GVC.

Transportei para o meu código as (pra mim) novidades que vc postou, entretanto, esta solução

Código: Selecionar todos

Tcod := iif(lastkey() # 27, Cod, 0)
continua levando o 27 da Tecla {ESC} para a função principal , que por isso cai no EXIT.

Acho que tem q intercalar o inkey(0.001) nela

Re: Preciso dar um "CLEA" no inkey/lastkey...

Enviado: 10 Jun 2010 13:55
por gvc
Veja que vc tem que tratar o buffer de teclado antes de sair da função de usuário do dbedit.
Veja que eu alterei a sua função para isso. Antes de sair com RETURN(0) eu coloquei o comando KEYBOARD ''.
Veja tb que eu mudei algumas outras coisas na sua função.

Re: Preciso dar um "CLEA" no inkey/lastkey...

Enviado: 10 Jun 2010 19:44
por lugab
Sim, GVC, eu adotei todas as mudanças q vc colocou. Mudei tudo.

Nem mexi na Rotina Extra() q vc refez. Adotei ela na íntegra, como o Keyboard e tudo o mais.

Acredite em mim. A linha

Código: Selecionar todos

Tcod := iif(lastkey() # 27, Cod, 0)
, após o Dbedit(), continuou mandando o inkey()=27 pro programa principal.

Eu pirateei tudo o q vc fez, porém substiui a linha acima por:

Código: Selecionar todos

If lastkey()#27
   Tcod=Cod   
else
    //--joga um HOME no teclado
    inkey(0.01)
    keyboard ''
    Tcod=0
Endi
E ai sim, funcionou... Missão cumprida.

Sou muito grato pelo seu interesse em me ajudar e a todos do tópico.

Gabriel

Re: Preciso dar um "CLEA" no inkey/lastkey...

Enviado: 12 Jun 2010 09:50
por JoséQuintas
Na minha opinião a forma está errada, sujeita a falhas.
Inkey(0.01) não limpa o buffer. Caso exista algo no buffer será processado.
Caso aconteça esta situação, o Keyboard Chr(1) vai chegar tarde demais, e ainda vai adicionar um comando especial do clipper.

Aqui uso assim:

Código: Selecionar todos

KeyBoard Chr(205)
Inkey(0)
Desta forma, obrigatoriamente ao chegar ao inkey, a única tecla existente será o que está em keyboard.

Re: Preciso dar um "CLEA" no inkey/lastkey...

Enviado: 12 Jun 2010 12:16
por alaminojunior
JoséQuintas escreveu:Na minha opinião a forma está errada, sujeita a falhas.
Também acho.
Eu ainda uso dbedit em algumas funções de menor importância e o fato de pressionar ESC no dbedit não interfere no getlist. Aliás nem devería.
Ainda não postei a maneira que uso, pois ainda não conseguí isolar o fato para melhor descrever.

Uma sugestão é:
Estando nos get´s, ao entrar no dbedit para qualquer pesquisa, no início desta função coloque um

Código: Selecionar todos

Priv GetList:= {}
. Pode ser que resolva.

Re: Preciso dar um "CLEA" no inkey/lastkey...

Enviado: 12 Jun 2010 22:24
por lugab
Experimentei a contribuição do José Quintas também, e deu tudo certo..

Obrigado a todos

Gabriel