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.