No artigo de hoje vamos ver como interceptar as teclas digitadas em um TGet em AdvPL, o famoso KeyPress.
Para podermos utilizar o recurso do KeyPress é necessário utilizarmos o método bGetKey, e nele o 3º parâmetro do bloco de código é o número da tecla digitada.
Então, para simularmos o exemplo, criamos uma tela simples com um TGet, e em baixo um label demonstrando a última letra digitada, conforme print abaixo:
Ai a cada caractere digitado, será exibido qual caractere foi digitado e quantos caracteres que faltam para dar o tamanho do get, conforme o gif abaixo:
E como nós fizemos isso? Basicamente com a seguinte lógica:
- Utilizamos o método bGetKey no nosso TGet com nome oGetTest, acionando a função fKeyPress
- Na fKeyPress, irá receber 3 parâmetros, sendo o 3º a tecla digitada pelo usuário
- Nessa mesma função, se a tecla for o código ascii menor que 255, for backspace ou delete, irá atualizar a mensagem
- A mensagem, irá exibir o caractere digitado e irá fazer a conta para demonstrar quantos caracteres ainda faltam conforme o tamanho inicial do cGetTest
Abaixo o código fonte desenvolvido do exemplo acima.
//Bibliotecas
#Include 'TOTVS.ch'
/*/{Protheus.doc} User Function zTstTGet
Funcao com tela customizada usando a classe TDialog que foi gerado pelo PDialogMaker
@type Function
@author Atilio
@since 07/10/2022
@see https://atiliosistemas.com/portfolio/pdialogmaker/
@obs Obrigado por usar um aplicativo da Atilio Sistemas
/*/
User Function zTstTGet()
Local aArea := FWGetArea()
Local nCorFundo := RGB(204, 255, 204)
Local nJanAltura := 96
Local nJanLargur := 298
Local cJanTitulo := 'Teste KeyPress'
Local lDimPixels := .T.
Local lCentraliz := .T.
Local nObjLinha := 0
Local nObjColun := 0
Local nObjLargu := 0
Local nObjAltur := 0
Private cFontNome := 'Tahoma'
Private oFontPadrao := TFont():New(cFontNome, , -12)
Private oDialogPvt
Private bBlocoIni := {|| /*fSuaFuncao()*/ } //Aqui voce pode acionar funcoes customizadas que irao ser acionadas ao abrir a dialog
//objeto0
Private oGetTest
Private cGetTest := Space(40) //Se o get for data para inicilizar use dToS(''), se for numerico inicie com 0
//objeto1
Private oSayInfo
Private cSayInfo := '...'
//Cria a dialog
oDialogPvt := TDialog():New(0, 0, nJanAltura, nJanLargur, cJanTitulo, , , , , , nCorFundo, , , lDimPixels)
//objeto0 - usando a classe TGet
nObjLinha := 8
nObjColun := 5
nObjLargu := 140
nObjAltur := 15
oGetTest := TGet():New(nObjLinha, nObjColun, {|u| Iif(PCount() > 0 , cGetTest := u, cGetTest)}, oDialogPvt, nObjLargu, nObjAltur, /*cPict*/, /*bValid*/, /*nClrFore*/, /*nClrBack*/, oFontPadrao, , , lDimPixels)
oGetTest:bGetKey := {|self, cText, nKey| fKeyPress(self, cText, nKey)}
//objeto1 - usando a classe TSay
nObjLinha := 28
nObjColun := 5
nObjLargu := 140
nObjAltur := 7
oSayInfo := TSay():New(nObjLinha, nObjColun, {|| cSayInfo}, oDialogPvt, /*cPicture*/, oFontPadrao, , , , lDimPixels, /*nClrText*/, /*nClrBack*/, nObjLargu, nObjAltur, , , , , , /*lHTML*/)
//Ativa e exibe a janela
oDialogPvt:Activate(, , , lCentraliz, , , bBlocoIni)
FWRestArea(aArea)
Return
Static Function fKeyPress(oObjeto, cTextoComp, nKey)
Local nTamCompl := Len(cGetTest)
Local nTamDigit := Len(Alltrim(cTextoComp))
//Se for algum caractere válido da tabela ASCII (até 255)
// Ou for o Backspace (16777219)
// Ou for o Delete (16777223)
If nKey < 255 .Or. nKey == 16777219 .Or. nKey == 16777223
//Vai mostrar uma mensagem no label abaixo, começando com o caractere digitado
cSayInfo := "'" + Chr(nKey) + "'"
//Agora complementa com o tamanho disponível
cSayInfo += " - Falta " + cValToChar(nTamCompl - nTamDigit) + " caracter(es)"
//Atualiza o label
oSayInfo:Refresh()
EndIf
Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.


Essa ideia é excelente para fazer busca, pesquisa, enquanto o usuário digita. Grato! Robson.
Bom dia Robson.
Nós que agradecemos pelo comentário e feedback.
Grande abraço.