Como usar TSystemTray com SIGAMDI | Ti Responde 0083

No vídeo de hoje, vamos demonstrar em como criar um ícone na bandeja do sistema operacional e mostrar popups através do AdvPL.

A dúvida de hoje, nos perguntaram, se seria possível criar um mecanismo que mostre popups para o usuário sendo possível abrir funcionalidades no ERP.

Pensando nisso, montamos esse exemplo, onde demonstramos em como utilizar a classe TSystemTray junto com o SIGAMDI mostrando Popups para o usuário e sendo possível abrir funções via tecla de atalho.

Segue abaixo o vídeo exemplificando:

E abaixo o código fonte desenvolvido:

//Bibliotecas
#Include "TOTVS.ch"
#Include "TopConn.ch"

//Variáveis estáticas
Static oSysTray
Static oTimer

/*/{Protheus.doc} User Function MdiOk
P.E. acionado logo ao abrir o sistema via SIGAMDI
@type  Function
@author Atilio
@since 22/12/2023
@see https://tdn.totvs.com/display/public/framework/MDIOK
/*/

User Function MdiOk()
    Local aArea := FWGetArea()
    Local lContinua := .T.
    Local oJanela := GetWndDefault()
    Local oMenu
    Local oItem1
    Local cIcon  := "totvsprinter_logo.png"
    Local nTempo := 10000 //60.000 milissegundos é igual a 1 minuto

    //Somente se for usuário administrador
    If FWIsAdmin() .And. ValType(oSysTray) == "U"
        //Monta o menu e os itens
        oMenu  := TMenu():New(0, 0, 0, 0, .T., , oJanela)
        oItem1 := TMenuItem():New(oJanela,'...', , , , {|| /* comandos */ },          , 'BR_VERDE', , , , , , , .T.)
        oItem2 := TMenuItem():New(oJanela,'Teste', , , , {|| Alert("testando, 123!") }, , 'CHECKED', , , , , , , .T.)
        oMenu:Add(oItem1)
        oMenu:Add(oItem2)

        //Cria o ícone na barra do S.O.
        oSysTray := TSystemTray():New(oJanela, cIcon)
        oSysTray:cToolTip := "Protheus"
        oSysTray:SetMenu(oMenu)

        //Temporizador para disparar mensagem
        oTimer := TTimer():New(    nTempo,;
                                {|| fAtualiza() },;
                                oJanela )
        oTimer:Activate()
    EndIf

    FWRestArea(aArea)
Return lContinua

Static Function fAtualiza()
    Local aArea     := FWGetArea()
    Local cMensagem := "Agora é " + Time()
    Local nTimeOut  := 8000 // 8.000 milissegundos é igual a 8 segundos
    Local cQuery    := ""
    Local nTotal    := 0

    //Busca os registros em analise que necessitam de aprovação
    cQuery += " SELECT  " + CRLF
    cQuery += " 	E2_NUM  " + CRLF
    cQuery += " FROM  " + CRLF
    cQuery += " 	" + RetSQLName("SE2") + " SE2 " + CRLF
    cQuery += " WHERE " + CRLF
    cQuery += " 	E2_FILIAL = '01' " + CRLF
    cQuery += " 	AND E2_VENCREA = '" + dToS(Date()) + "' " + CRLF
    cQuery += " 	AND E2_BAIXA = '' " + CRLF
    cQuery += " 	AND SE2.D_E_L_E_T_ = ' ' " + CRLF
    TCQuery cQuery New Alias "QRY_SE2"

    //Se existem dados
    If ! QRY_SE2->(EoF())

        //Conta a quantidade de registros
        Count To nTotal
        QRY_SE2->(DbGoTop())

        //Monta a mensagem que será exibida
        cMensagem := "Existem '" + cValToChar(nTotal) + "' títulos a pagar em aberto vencendo hoje. Pressione a tecla -F9- que será aberto a tela para análise."

        //Exibe uma mensagem no S.O.
        oSysTray:ShowMessage(;
            "Pressione -F9-",; //[ cTitulo ],;
            cMensagem,; //[ cMessage ],;
            1,;         //[ nTypeMessage ],;
            nTimeOut,;  //[ ntimeout ],;
            {||};       //[ bAction ];
        )
    EndIf
    QRY_SE2->(DbCloseArea())

    FWRestArea(aArea)
Return

/*/{Protheus.doc} User Function ChkExec
Ponto de Entrada acionado ao clicar em alguma opção no menu
@type  Function
@author Atilio
@since 22/12/2023
@see https://tdn.totvs.com/display/public/framework/CHKEXEC+-+Dispara+ponto+de+entrada
/*/

User Function ChkExec()
    Local lContinua := .T.

    //Somente se for usuário administrador
    If FWIsAdmin()
    
        //Adiciona o atalho
        SetKey(VK_F9, {|| FinA750() })
    EndIf

Return lContinua

Bom pessoal, por hoje é só.

Abraços e até a 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.

6 Responses

  1. Ruan Pablo disse:

    Mestre muito bom esse artigo a minha duvida é eu adaptei ele para trazer os pedidos de compra pendente aprovação, só que quando coloco SetKey(VK_F9, {|| MATA094() }) ele nao deixa o botão de aprovar visível tem ideia de como posso resolver isso?

    • Bom dia Ruan, tudo joia?

      Tenta encapsular numa User Function e forçar a mudança de nome da função, por exemplo:

      SetKey(VK_F9, {|| u_SuaFuncao()})

      Ai na sua função, ficaria algo assim:

      User Function zSuaFuncao()
      Local aArea := FWGetArea()
      Local cFunBkp := FunName()

      //Muda o nome da função e aciona
      SetFunName(‘MATA094’)
      MATA094()

      //Volta o nome da função para o Backup
      SetFunName(cFunBkp)

      FWRestArea(aArea)
      Return

      Tenha uma ótima e abençoada sexta feira.

      Um grande abraço.

  2. Pedro Henrique de Almeida disse:

    Boa tarde Mestre, tenho uma duvida, compilei o fonte porem no meu caso aparece o icone ao lado do relógio com as opções porem o popup não aparece na tela.

Deixe uma resposta

Terminal de Informação