Criando um temporizador através da TTimer – Maratona AdvPL e TL++ 513

Nesse vídeo demonstraremos a utilização da classe TTimer, que serve para criar um temporizador que irá rodar conforme uma quantidade de milissegundos definida.

Abaixo o código fonte desenvolvido para o exemplo em vídeo acima:

//Bibliotecas
#Include "TOTVS.ch"

/*/{Protheus.doc} User Function zExe513
Cria um temporizador que é executado a cada x milissegundos
@type  Function
@author Atilio
@since 05/04/2023
@see https://tdn.totvs.com/display/tec/TTimer
@obs 
    
    **** Apoie nosso projeto, se inscreva em https://www.youtube.com/TerminalDeInformacao ****
/*/

User Function zExe513()
    Local aArea := FWGetArea()
    Private nTempo := 30000 //30.000 milissegundos e igual a 30 segundos
    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
  
    FWRestArea(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é próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação