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

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

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

Mensagem 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
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

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

Mensagem 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.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

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

Mensagem 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...
lugab
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

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

Mensagem 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
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

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

Mensagem 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
lugab
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

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

Mensagem por alaminojunior »

Sou capaz de apostar que em menos de um dia você disseca ele.
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

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

Mensagem 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+
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

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

Mensagem 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)
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

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

Mensagem 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
lugab
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

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

Mensagem 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.
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

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

Mensagem 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
lugab
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

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

Mensagem 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.
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

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

Mensagem por lugab »

Experimentei a contribuição do José Quintas também, e deu tudo certo..

Obrigado a todos

Gabriel
lugab
Responder