No artigo de hoje, vamos demonstrar como criar um temporizador para atualizar uma tela em AdvPL, utilizando a classe TTimer.
A classe TTimer tem como intuito, executar um processo a cada x milissegundos, dessa forma, se precisamos criar uma tela que atualize a cada 5 minutos, podemos utilizar essa classe.
Só temos que ter uma preocupação, no caso enquanto a rotina de atualização estiver sendo executada, ela não pode ser executada novamente, então devemos bloquear enquanto a execução estiver ativa, e para isso usamos uma variável flag.
E um detalhe importante, é que essa classe só pode ser instanciada, vinculada a algum objeto, como por exemplo uma dialog.
Abaixo um print de uma tela que atualiza a cada 5 minutos:
Abaixo o código fonte do print acima (a função que atualiza a tela é a fAtualiza que pode ser chamada manualmente via botão, ou que vai ser acionada automaticamente a cada 5 minutos):
//Bibliotecas
#Include "TOTVS.ch"
/*/{Protheus.doc} User Function zTstTime
Função de exemplo para testar a classe TTimer
@type Function
@author Atilio
@since 18/05/2021
@version version
/*/
User Function zTstTime()
Local aArea := GetArea()
Private nTempo := 300000 //300.000 milissegundos e igual a 5 minutos
Private lUpdate := .F.
Private dDataAtu := Date()
//Objetos da Janela
Private oDlgPvt
Private oBtnAtu
Private oBtnFech
Private oTimer
Private nTamBtn := 048
Private cGetTot := ""
Private oGetTot
Private cGetObs := ""
Private oGetObs
//Tamanho da Janela
Private aTamanho := MsAdvSize()
Private nJanLarg := 600 //aTamanho[5]
Private nJanAltu := 150 //aTamanho[6]
//Fontes
Private cFontUti := "Tahoma"
Private oFontAno := TFont():New(cFontUti,,-38)
Private oFontSub := TFont():New(cFontUti,,-20)
Private oFontSubN := TFont():New(cFontUti,,-20,,.T.)
Private oFontBtn := TFont():New(cFontUti,,-14)
//Criacao da tela com os dados que serao informados dos titulos
DEFINE MSDIALOG oDlgPvt TITLE "Teste de TTimer" FROM 000, 000 TO nJanAltu, nJanLarg COLORS 0, 16777215 PIXEL
//Labels gerais
@ 004, 003 SAY "TI" SIZE 200, 030 FONT oFontAno OF oDlgPvt COLORS RGB(149,179,215) PIXEL
@ 004, 030 SAY "Função de Exemplo" SIZE 200, 030 FONT oFontSub OF oDlgPvt COLORS RGB(031,073,125) PIXEL
@ 014, 030 SAY "para testar TTimer" SIZE 200, 030 FONT oFontSubN OF oDlgPvt COLORS RGB(031,073,125) PIXEL
//Botoes
@ 006, (nJanLarg/2-3)-((nTamBtn)*01)-0 BUTTON oBtnFech PROMPT "Fechar" SIZE nTamBtn, 018 OF oDlgPvt ACTION (oDlgPvt:End()) FONT oFontBtn PIXEL
@ 006, (nJanLarg/2-3)-((nTamBtn)*02)-1 BUTTON oBtnAtu PROMPT "Atualizar" SIZE nTamBtn, 018 OF oDlgPvt ACTION (fAtualiza()) FONT oFontBtn PIXEL
//Get com Total de Produtos
@ 030, 003 MSGET oGetTot VAR cGetTot SIZE (nJanLarg/2) - 3, 015 OF oDlgPvt COLORS 0, 16777215 FONT oFontBtn PIXEL
oGetTot:lReadOnly := .T.
//Get com observacoes
@ (nJanAltu/2)-21, 003 MSGET oGetObs VAR cGetObs SIZE (nJanLarg/2) - 3, 015 OF oDlgPvt COLORS 0, 16777215 FONT oFontBtn PIXEL
oGetObs:lReadOnly := .T.
oGetObs:setCSS("QLineEdit{color:#ff0000; background-color:#ffffff;}")
//Chamando a primeira vez para atualizar o get
fAtualiza()
//Temporizador para atualizar a tela sozinho
oTimer := TTimer():New( nTempo,;
{|| fAtualiza() },;
oDlgPvt )
oTimer:Activate()
ACTIVATE MSDIALOG oDlgPvt CENTERED
RestArea(aArea)
Return
Static Function fAtualiza()
Processa({|| fAtuTela()}, "Processando...")
Return
Static Function fAtuTela()
Local cQuery := ""
Local nTotal := 0
//Se nao estiver sendo atualizada, comeca a atualizar a tela
If ! lUpdate
lUpdate := .T.
//Monta a query, executa e pega o resultado
cQuery := " SELECT " + CRLF
cQuery += " COUNT(B1_COD) AS TOTAL " + CRLF
cQuery += " FROM " + CRLF
cQuery += " " + RetSQLName("SB1") + " SB1 " + CRLF
cQuery += " WHERE " + CRLF
cQuery += " B1_FILIAL = '" + FWxFilial('SB1') + "' " + CRLF
cQuery += " AND SB1.D_E_L_E_T_ = '' " + CRLF
PLSQuery(cQuery, "QRY_SB1")
nTotal := QRY_SB1->TOTAL
QRY_SB1->(DbCloseArea())
//Atualiza o totalizador dos produtos
cGetTot := cValToChar(nTotal) + " produtos encontrados!"
oGetTot:Refresh()
//Atualiza o Get de Observacao
cGetObs := "Rotina atualiza a cada " + cValToChar(nTempo / 60000) + " minutos. ult. atualizacao - " + dToC(Date()) + " as " + Time()
oGetObs:Refresh()
lUpdate := .F.
EndIf
Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.
