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
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
, 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:
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
. 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