Jump to content
Fivewin Brasil

Associar função à notificação do Tray


alex2002

Recommended Posts

Olá PessoALL,

Alguém saberia me dizer se consigo fazer uma associação de uma função xHarbour para ser utilizada na notificação do Windows (aquela mesma do tray já comentado aqui no grupo)?

Pergunto pois, se o sistema notificar o usuário dentro do sistema, queria abrir uma janela caso o usuário clique na notificação. Exatamente igual existe para atualizações do Java, etc.

Não sei se é possível, mas se for será de granda valia pra mim.

Um abraço,

Alexandre Pereira

 

Link to comment
Share on other sites

Olá, existe a classe da Fivewin TTrayIcon que faz exatamente isto! na pasta samples tem exemplo: testtray.prg

#include "Fivewin.CH"

static oWnd, oTray, oIcon

function TESTIT()

  local oIcon1

  DEFINE ICON oIcon  FILE "..\icons\fivewin.ICO"
  DEFINE ICON oIcon1 FILE "..\icons\folder.ico"

  DEFINE WINDOW oWnd TITLE "Icon Tray Class for FiveWin! from Jim Gale" ICON oIcon

  ACTIVATE WINDOW oWnd ;
     ON INIT oTray := TTrayIcon():New( oWnd, oIcon, "Testing tray ...",;
             { || MsgInfo( "Left CLick" ) },;
             { | nRow, nCol | MenuTray( nRow, nCol, oTray ) } ) ;
     VALID oTray:End() ;
     ON RIGHT CLICK oTray:SetIcon( oIcon1, "Another" )

return NIL

function MenuTray( nRow, nCol, oTray )

   local oMenu

   MENU oMenu POPUP
      MENUITEM "Show" ACTION oWnd:Show(), oWnd:SetFocus()
      MENUITEM "Hide" ACTION oWnd:Hide()
      SEPARATOR
      MENUITEM "Close Application" ACTION oWnd:end()
   ENDMENU

   ACTIVATE POPUP oMenu AT nRow, nCol OF oTray:oWnd

return NIL

Por algum motivo não consegui fazer funcionar perfeitamente no xHarbour, acabei usando HB32 deu tudo certo. Mas não verifiquei a causa do erro no xHB.

JMSilva

Link to comment
Share on other sites

14 horas atrás, Jmsilva disse:

Olá, existe a classe da Fivewin TTrayIcon que faz exatamente isto! na pasta samples tem exemplo: testtray.prg


#include "Fivewin.CH"

static oWnd, oTray, oIcon

function TESTIT()

  local oIcon1

  DEFINE ICON oIcon  FILE "..\icons\fivewin.ICO"
  DEFINE ICON oIcon1 FILE "..\icons\folder.ico"

  DEFINE WINDOW oWnd TITLE "Icon Tray Class for FiveWin! from Jim Gale" ICON oIcon

  ACTIVATE WINDOW oWnd ;
     ON INIT oTray := TTrayIcon():New( oWnd, oIcon, "Testing tray ...",;
             { || MsgInfo( "Left CLick" ) },;
             { | nRow, nCol | MenuTray( nRow, nCol, oTray ) } ) ;
     VALID oTray:End() ;
     ON RIGHT CLICK oTray:SetIcon( oIcon1, "Another" )

return NIL

function MenuTray( nRow, nCol, oTray )

   local oMenu

   MENU oMenu POPUP
      MENUITEM "Show" ACTION oWnd:Show(), oWnd:SetFocus()
      MENUITEM "Hide" ACTION oWnd:Hide()
      SEPARATOR
      MENUITEM "Close Application" ACTION oWnd:end()
   ENDMENU

   ACTIVATE POPUP oMenu AT nRow, nCol OF oTray:oWnd

return NIL

Por algum motivo não consegui fazer funcionar perfeitamente no xHarbour, acabei usando HB32 deu tudo certo. Mas não verifiquei a causa do erro no xHB.

JMSilva

Olá meu amigo.

Na verdade o que a classe faz é um menu, eu queria que na notificação me desse a oportunidade de executar uma função, quando clicado. Exatamente os antivírus, atualizações nos permitem fazer. 

Enfim, vou notificar o usuário com shellnotify e se o cara clicar executaria uma determinada função. Creio não ser possível porque a o shellnotify na verdade é uma function das DLLs do windows, por isso acho não ser possível. Mas de qualquer forma, se existir estamos dentro.

Um abraço,

Alexandre Pereira

Link to comment
Share on other sites

********************************************************************************
** Arquivo...: TCheckVersaoDisponivel.Prg                                      *
********************************************************************************
** Função....: TCheckVersaoDisponivel()                                        *
** Objetivo..: Checar se existe uma versão disponível no site do sistema       *
** Módulo....: Library                                                         *
** Autor.....: Márcio Augusto Cezar                                            *
** Data......: 16/10/2008 17:16:03                                             *
********************************************************************************
** Retorno...:                                                                 *
********************************************************************************
** Observação: Exemplo da chamada                                              *
** TCheckVersaoDisponivel():new( oWnd,      -> Window principal                *
**                               BUILD,     -> Versão atual do sistema         *
**                               DT_VERSAO, -> Data da versão atual            *
**                               cSiglaSys, -> Sigla do sistema                *
**                               nome_empresa ) ->Senha da empresa             *
**                              :Execute()  -> Método que executa a classe     *
**                                                                             *
********************************************************************************

/*
** Definicoes para o tratamento de efeitos nas dialogs do sistema
**
** Informacoes de animação para API do windows
**/
# Define AW_HOR_POSITIVE   1      && Animates the window from left to right. This flag can be used with roll or slide animation.
# Define AW_HOR_NEGATIVE   2      && Animates the window from right to left. This flag can be used with roll or slide animation.
# Define AW_VER_POSITIVE   4      && Animates the window from top to bottom. This flag can be used with roll or slide animation.
# Define AW_VER_NEGATIVE   8      && Animates the window from bottom to top. This flag can be used with roll or slide animation.
# Define AW_CENTER         16     && Makes the window appear to collapse inward if AW_HIDE is used or expand outward if the AW_HIDE is not used.
# Define AW_HIDE           65536  && Hides the window. By default, the window is shown.
# Define AW_ACTIVATE       131072 && Activates the window.
# Define AW_SLIDE          262144 && Uses slide animation. By default, roll animation is used.
# Define AW_BLEND          524288 && Uses a fade effect. This flag can be used only if hwnd is a top-level window.

# Include "FiveWin.Ch"
# Include "HBXml.Ch"
# Include "FileIO.Ch"
# Include "URLLink.Ch"

CLASS TCheckVersaoDisponivel

   PRIVATE:

   DATA aOcorrencias      AS ARRAY

   DATA cVersaoAtual      ,;
        cVersaoDisponivel ,;
        cSiglaSistema     ,;
        cSenhaEmpresa     ,;
		  cNomeEmpresa      ,;
        cTituloDialog     AS CHARACTER

   DATA cLink             ,;
        cFileVersion      ,;
        cResources        AS CHARACTER

	DATA dDataVersaoAtual  ,;
	     dDataVersaoDisponivel AS DATE

	DATA lSistemaAtivo	   ,;
	     lForceVisualizacao AS LOGIC

   DATA oWnd AS OBJECT

   METHOD getLink()       INLINE ::cLink := "http://www.????????????????senha=" + alltrim( ::cSenhaEmpresa )
   METHOD putVersaoFile()
   METHOD dialogMensagem()

   PUBLIC:

   METHOD new( oWnd, cVersaoAtual, dDataVersaoAtual, cSiglaSistema, cEmpresa, cTituloDialog ) CONSTRUCTOR
   METHOD end() INLINE  ( PostMessage( self, WM_CLOSE ) ) //setResources( ::cResources )
   METHOD execute( lViewDadosLink )
   METHOD getSistemaAtivo()     INLINE ( ::lSistemaAtivo )
   METHOD getVersaoDisponivel() INLINE ( ::cVersaoDisponivel )
   METHOD getDataVersao()       INLINE ( ::dDataVersaoDisponivel )
   METHOD getOcorrencias()      INLINE ( ::aOcorrencias )
   METHOD ajustaDialog( oDlg )

ENDCLASS

*********************************************************************************
** Método....: new()                                                            *
** Objetivo..: Método construtor da classe                                      *
** Autor.....: Márcio Augusto Cezar                                             *
** Data......: 16/10/2008 17:23:19                                              *
*********************************************************************************
** Observação:                                                                  *
*********************************************************************************

METHOD new( oWnd, cVersaoAtual, dDataVersaoAtual, cSiglaSistema, cEmpresa, cTituloDialog, lForceVisualizacao ) CLASS TCheckVersaoDisponivel

  DEFAULT cTituloDialog := "Existe uma nova versão disponível para o sistema"
  DEFAULT lForceVisualizacao := .F.

  ::oWnd			    	:= oWnd

  ::cResources       := getResources()
  ::cVersaoAtual     := alltrim( cVersaoAtual )
  ::cSiglaSistema    := cSiglaSistema
  ::cSenhaEmpresa    := PassWord( alltrim( cEmpresa ) )
  ::dDataVersaoAtual := dDataVersaoAtual
  ::cTituloDialog    := cTituloDialog + " " + cSiglaSistema

  ::cVersaoDisponivel     := ""
  ::dDataVersaoDisponivel := ctod("")
  ::lForceVisualizacao    := lForceVisualizacao

  ::cFileVersion  := "SystemVer.Txt"

RETURN self

*********************************************************************************
** Método....: putVersaoFile()                                                  *
** Objetivo..: Escreve a versão do sistema no arquivo XML                       *
** Autor.....: Márcio Augusto Cezar                                             *
** Data......: 16/10/2008 17:43:11                                              *
*********************************************************************************
** Observação:                                                                  *
*********************************************************************************

METHOD putVersaoFile()

   LOCAL oHttp, oUrl

   IF file( ::cFileVersion )
      FErase( ::cFileVersion )
   ENDIF

   oUrl  := TUrl():New( ::getLink() )
   oHttp := TIPClient():New( oUrl )

   oHttp:nConnTimeout := 1000
   oHttp:nDefaultPort := 9600

   // Gravando no arquivo!
   ///////////////////////
   IF oHttp:Open()
      IF ! oHttp:ReadToFile( ::cFileVersion, FC_NORMAL, 300 )
        // msgStop( "Não foi possível criar o arquivo " + ::cFileVersion )
      ENDIF
   ENDIF

   IF oHttp <> Nil
      oHttp:Close()
   ENDIF

RETURN file( ::cFileVersion )

*********************************************************************************
** Método....: Execute()                                                        *
** Objetivo..: Executar os procedimentos da classe                              *
** Autor.....: Márcio Augusto Cezar                                             *
** Data......: 16/10/2008 17:27:39                                              *
*********************************************************************************
** Observação:                                                                  *
*********************************************************************************

METHOD execute( lViewDadosLink ) CLASS TCheckVersaoDisponivel

   LOCAL oFile, oXML, oNode, oIter
   LOCAL aLines := {}

   DEFAULT lViewDadosLink := .F.

   ::aOcorrencias := {}

   BEGIN SEQUENCE

      // Checando se existe conectividade com a internet
      //////////////////////////////////////////////////
      IF ! ChecaInternet( "www.simtechsistemas.com.br" )
         aAdd( ::aOcorrencias, "Não há conexão com a Internet" )
      ENDIF

      IF ! ::putVersaoFile()
        aAdd( ::aOcorrencias, "Não foi possível gravar o registro de versão no arquivo XML" )
      ENDIF

      TRY
        oFile := TTxtFile():new( ::cFileVersion )
      CATCH
        aAdd( ::aOcorrencias, "Erro na abertura do arquivo XML" )
      END

      IF FError() <> 0
        ::aAdd( ::aOcorrencias, "Erro na abertura do arquivo XML" )
      ENDIF

      IF len( ::aOcorrencias ) <> 0
         BREAK
      ENDIF

      WHILE ! oFile:lEof()

         aAdd( aLines, oFile:readLine() )

         oFile:Skip()

      ENDDO

      oFile:close()

      IF lViewDadosLink
         mytoString( aLines )
      ENDIF

   	IF len( aLines ) > 0

   		IF ! ( ::lSistemaAtivo := "ATIVO" $ upper( aLines[01] ) )
            BREAK
         ENDIF
   
         ::cNomeEmpresa  := aLines[02]
   
   	   FOR nX := 3 TO len( aLines )
   
   	       IF left( aLines[ nX ], 3 ) == ::cSiglaSistema
   	       	 ::cVersaoDisponivel     := subStr( aLines[ nX ], at( "-", aLines[ nX ] ) + 1 )
                ::cVersaoDisponivel     := alltrim( subStr( ::cVersaoDisponivel, 1, at( "-", ::cVersaoDisponivel ) - 1 ) )
   	       	 ::dDataVersaoDisponivel := ctod( alltrim( subStr( aLines[ nX ], rat( "-", aLines[ nX ] ) + 1 ) ) )
   	       ENDIF
   
   	   NEXT
   
   	ENDIF
   
      IF ( ::cVersaoDisponivel > ::cVersaoAtual .OR. ::dDataVersaoDisponivel > ::dDataVersaoAtual ) .OR. ::lForceVisualizacao
   
         // Exibindo a mensagem na tela
         //////////////////////////////
         ::dialogMensagem()

      ENDIF

   END SEQUENCE

RETURN ( len( ::aOcorrencias ) == 0 )


*********************************************************************************
** Método....: ajustaDialog()                                                   *
** Objetivo..: Ajustar posicionamento de uma determinada dialog em relação à    *
**             janela principal                                                 *
** Autor.....: Márcio Augusto Cezar                                             *
** Data......: 20/10/2008 - 16:25:22                                            *
*********************************************************************************
** Parâmetros: oDlg --> Objeto dialog que será ajustado                         *
*********************************************************************************
METHOD ajustaDialog( oDlg ) CLASS TCheckVersaoDisponivel

	LOCAL aCoorsWnd := { 0, 0 }
	LOCAL nTopWnd   := 0
	LOCAL nLeftWnd  := 0

	// ---> Recuperando as coordenadas da dialog e da janela pai
	////////////////////////////////////////////////////////////
	aCoorsWnd := clientToScreen( ::oWnd:hWnd, aCoorsWnd )
	nTopWnd   := ( ( aCoorsWnd[1] + ::oWnd:nHeight ) - oDlg:nHeight ) - 77
	nLeftWnd  := ( ::oWnd:nWidth() - oDlg:nWidth() ) - 8

	// ---> Posicionando a dialog
	/////////////////////////////
	oDlg:move( nTopWnd, nLeftWnd,,, .T. )

	::oWnd:setFocus()

RETURN

*********************************************************************************
** Método....: dialogMensagem()                                                 *
** Objetivo..: Configuração da dialog da mensagem                               *
** Autor.....: Márcio Augusto Cezar                                             *
** Data......: 20/10/2008 - 16:14:07                                            *
*********************************************************************************
** Observação:                                                                  *
*********************************************************************************

METHOD dialogMensagem() CLASS TCheckVersaoDisponivel

	LOCAL oDlg, oFont, oFont2, oLastDlg, oTimer, oLink
	LOCAL oObj := self
	LOCAL cColorBack  := 16768959
	LOCAL cColorText1 := CLR_BLACK
	LOCAL cColorText2 := CLR_BLUE
	LOCAL cColorText3 := 106

   // ---> Salvando a última janela ativa antes da mensagem
   ////////////////////////////////////////////////////////
   oLastDlg := oWndFromhWnd( getActiveWindow() )

	setResources( "Comum.Dll" )

	DEFINE DIALOG oDlg RESOURCE "CHK_NOVA_VERSAO" OF ::oWnd COLOR CLR_BLACK, cColorBack

      oFont  := TFont():New( "MS Sans Serif", 0, 15,, .T. )
      oFont2 := TFont():New( "Courier"      , 0, 12,, .T. )

      // ---> Criando o timer para close automatico da dialog
      ///////////////////////////////////////////////////////

      oTimer := TTimer():new( 10000, { || animateDlg( oDlg, "fadeOut",, .T. ), oTimer:end() }, oObj:oWnd )

		REDEFINE SAY ID 4001 OF oDlg COLOR 22784      , cColorBack FONT oFont  PROMPT ::cTituloDialog
		REDEFINE SAY ID 4002 OF oDlg COLOR cColorText1, cColorBack FONT oFont2 PROMPT ::cVersaoAtual
	   REDEFINE SAY ID 4003 OF oDlg COLOR cColorText1, cColorBack FONT oFont2 PROMPT ::dDataVersaoAtual
		REDEFINE SAY ID 4004 OF oDlg COLOR cColorText2, cColorBack FONT oFont2 PROMPT ::cVersaoDisponivel
	   REDEFINE SAY ID 4005 OF oDlg COLOR cColorText2, cColorBack FONT oFont2 PROMPT ::dDataVersaoDisponivel

      REDEFINE SAY ID 4006 OF oDlg COLOR cColorText3, cColorBack
      REDEFINE SAY ID 4007 OF oDlg COLOR cColorText3, cColorBack
      REDEFINE SAY ID 4008 OF oDlg COLOR cColorText3, cColorBack
      REDEFINE SAY ID 4009 OF oDlg COLOR cColorText3, cColorBack

      REDEFINE SAY ID 4010 OF oDlg COLOR CLR_BLACK, cColorBack
      REDEFINE URLLINK oLink ID 4011 URL "www.simtechsistemas.com.br" OF oDlg TOOLTIP "Click neste link para acessar a página da simtechsistemas Informática"

      oLink:SetColor( oLink:nClrInit, cColorBack )

	ACTIVATE DIALOG oDlg NOWAIT ON INIT ( oObj:ajustaDialog( oDlg ), oTimer:activate() )

	oFont:End()
	oFont2:End()

   // ---> Realizando o foco da última janela após a visualização de novas mensagens
   /////////////////////////////////////////////////////////////////////////////////
   IF oLastDlg <> NIL
      oLastDlg:setFocus()
   ELSE
      ::oWnd:setFocus()
   ENDIF

RETURN

*********************************************************************************
** Função....: animateDlg()                                                     *
** Objetivo..: Realizar uma determinada animação na dialog/window               *
** Autor.....: Márcio Augusto Cezar                                             *
** Data......: 20/10/2008 - 15:46:44                                            *
*********************************************************************************
** Parâmetros: oDlg --> Objeto dialog/window para controle da animação          *
**             cTipoAnimacao --> String contendo o tipo de animação a ser feita *
**                               de acordo com os tipos definidos pela API      *
**             nDuracao --> Velocidade a ser realizada a animação               *
**             lFechaDlg --> Expr. Lógica indicando se a Dialog/Window deverá   *
**                           ser finalizada                                     *
*********************************************************************************
** Retorno...: NIL                                                              *
*********************************************************************************
FUNCTION animateDlg( oDlg, cTipoAnimacao, nDuracao, lFechaDlg )

DEFAULT cTipoAnimacao := "fadeIn", ;
        nDuracao      := if( inArray( { "fadeOut", "fadeIn" }, cTipoAnimacao ), 1000, 200 ), ;
        lFechaDlg     := .F.

// ---> Realizando a animação apropriada, definida em cTipoAnimacao
///////////////////////////////////////////////////////////////////

IF ( cTipoAnimacao == "fadeIn" )

   animateWindow( oDlg:hWnd, nDuracao, AW_BLEND + AW_CENTER )

ELSEIF ( cTipoAnimacao == "fadeOut" )

  IF ( animateWindow( oDlg:hWnd, nDuracao, AW_BLEND + AW_HIDE ) == 0 )
     oDlg:hide()
  ENDIF

ELSEIF ( cTipoAnimacao == "toUp" )

   animateWindow( oDlg:hWnd, nDuracao, AW_VER_NEGATIVE )

ELSEIF ( cTipoAnimacao == "toDown" )

   animateWindow( oDlg:hWnd, nDuracao, AW_VER_POSITIVE )

ELSEIF ( cTipoAnimacao == "fromLeft" )

   animateWindow( oDlg:hWnd, nDuracao, AW_HOR_POSITIVE )

ELSEIF ( cTipoAnimacao == "fromRight" )

   animateWindow( oDlg:hWnd, nDuracao, AW_HOR_NEGATIVE )

ENDIF

// ---> Atualizando a dialog para objetos say/image
///////////////////////////////////////////////////
oDlg:refresh()

// ---> Verificando se a dialog deverá ser fechada
///////////////////////////////////////////////////
if( lFechaDlg, oDlg:end(), )

RETURN( NIL )

*********************************************************************************
** Função....: Funções de controle geral para Dialogs/Window a partir de API    *
** Autor.....: Márcio Augusto Cezar                                             *
** Data......: 13/06/2008 11:00:53                                              *
*********************************************************************************
DLL FUNCTION animateWindow( hWnd AS LONG, dwTime AS LONG, dwFlags AS LONG ) AS LONG PASCAL ;
FROM "AnimateWindow" LIB "user32.dll"

DLL FUNCTION findWndByClass( wndClass AS LPSTR, wndName AS LPSTR ) AS LONG PASCAL ;
FROM "FindWindowA" LIB "user32.dll"

*********************************************************************************
** Método....: inArray()                                                        *
** Objetivo..: Checa se determinado parâmetro encontra-se no array informado    *
** Autor.....: Márcio Augusto Cezar                                             *
** Data......: 20/10/2008 - 17:16:32                                            *
*********************************************************************************
** Observação:                                                                  *
*********************************************************************************

FUNCTION inArray( aVetor, uParametro, bBlocoCodigo )

   LOCAL lInArray := .F.

   DEFAULT uParametro   := "", ;
           aVetor       := {}, ;
           bBlocoCodigo := NIL

   IF bBlocoCodigo == NIL
      lInArray := ( ascan( aVetor, { | uParam | uParam == uParametro } ) > 0 )
   ELSE
      lInArray := ( ascan( aVetor, bBlocoCodigo ) > 0 )
   ENDIF

RETURN( lInArray )

 

Esta função checa se existe uma versão disponível no ftp e apresenta uma notificação no try. Você pode adaptar pra você.

Link to comment
Share on other sites

7 minutos atrás, macs disse:

********************************************************************************
** Arquivo...: TCheckVersaoDisponivel.Prg                                      *
********************************************************************************
** Função....: TCheckVersaoDisponivel()                                        *
** Objetivo..: Checar se existe uma versão disponível no site do sistema       *
** Módulo....: Library                                                         *
** Autor.....: Márcio Augusto Cezar                                            *
** Data......: 16/10/2008 17:16:03                                             *
********************************************************************************
** Retorno...:                                                                 *
********************************************************************************
** Observação: Exemplo da chamada                                              *
** TCheckVersaoDisponivel():new( oWnd,      -> Window principal                *
**                               BUILD,     -> Versão atual do sistema         *
**                               DT_VERSAO, -> Data da versão atual            *
**                               cSiglaSys, -> Sigla do sistema                *
**                               nome_empresa ) ->Senha da empresa             *
**                              :Execute()  -> Método que executa a classe     *
**                                                                             *
********************************************************************************

/*
** Definicoes para o tratamento de efeitos nas dialogs do sistema
**
** Informacoes de animação para API do windows
**/
# Define AW_HOR_POSITIVE   1      && Animates the window from left to right. This flag can be used with roll or slide animation.
# Define AW_HOR_NEGATIVE   2      && Animates the window from right to left. This flag can be used with roll or slide animation.
# Define AW_VER_POSITIVE   4      && Animates the window from top to bottom. This flag can be used with roll or slide animation.
# Define AW_VER_NEGATIVE   8      && Animates the window from bottom to top. This flag can be used with roll or slide animation.
# Define AW_CENTER         16     && Makes the window appear to collapse inward if AW_HIDE is used or expand outward if the AW_HIDE is not used.
# Define AW_HIDE           65536  && Hides the window. By default, the window is shown.
# Define AW_ACTIVATE       131072 && Activates the window.
# Define AW_SLIDE          262144 && Uses slide animation. By default, roll animation is used.
# Define AW_BLEND          524288 && Uses a fade effect. This flag can be used only if hwnd is a top-level window.

# Include "FiveWin.Ch"
# Include "HBXml.Ch"
# Include "FileIO.Ch"
# Include "URLLink.Ch"

CLASS TCheckVersaoDisponivel

   PRIVATE:

   DATA aOcorrencias      AS ARRAY

   DATA cVersaoAtual      ,;
        cVersaoDisponivel ,;
        cSiglaSistema     ,;
        cSenhaEmpresa     ,;
		  cNomeEmpresa      ,;
        cTituloDialog     AS CHARACTER

   DATA cLink             ,;
        cFileVersion      ,;
        cResources        AS CHARACTER

	DATA dDataVersaoAtual  ,;
	     dDataVersaoDisponivel AS DATE

	DATA lSistemaAtivo	   ,;
	     lForceVisualizacao AS LOGIC

   DATA oWnd AS OBJECT

   METHOD getLink()       INLINE ::cLink := "http://www.????????????????senha=" + alltrim( ::cSenhaEmpresa )
   METHOD putVersaoFile()
   METHOD dialogMensagem()

   PUBLIC:

   METHOD new( oWnd, cVersaoAtual, dDataVersaoAtual, cSiglaSistema, cEmpresa, cTituloDialog ) CONSTRUCTOR
   METHOD end() INLINE  ( PostMessage( self, WM_CLOSE ) ) //setResources( ::cResources )
   METHOD execute( lViewDadosLink )
   METHOD getSistemaAtivo()     INLINE ( ::lSistemaAtivo )
   METHOD getVersaoDisponivel() INLINE ( ::cVersaoDisponivel )
   METHOD getDataVersao()       INLINE ( ::dDataVersaoDisponivel )
   METHOD getOcorrencias()      INLINE ( ::aOcorrencias )
   METHOD ajustaDialog( oDlg )

ENDCLASS

*********************************************************************************
** Método....: new()                                                            *
** Objetivo..: Método construtor da classe                                      *
** Autor.....: Márcio Augusto Cezar                                             *
** Data......: 16/10/2008 17:23:19                                              *
*********************************************************************************
** Observação:                                                                  *
*********************************************************************************

METHOD new( oWnd, cVersaoAtual, dDataVersaoAtual, cSiglaSistema, cEmpresa, cTituloDialog, lForceVisualizacao ) CLASS TCheckVersaoDisponivel

  DEFAULT cTituloDialog := "Existe uma nova versão disponível para o sistema"
  DEFAULT lForceVisualizacao := .F.

  ::oWnd			    	:= oWnd

  ::cResources       := getResources()
  ::cVersaoAtual     := alltrim( cVersaoAtual )
  ::cSiglaSistema    := cSiglaSistema
  ::cSenhaEmpresa    := PassWord( alltrim( cEmpresa ) )
  ::dDataVersaoAtual := dDataVersaoAtual
  ::cTituloDialog    := cTituloDialog + " " + cSiglaSistema

  ::cVersaoDisponivel     := ""
  ::dDataVersaoDisponivel := ctod("")
  ::lForceVisualizacao    := lForceVisualizacao

  ::cFileVersion  := "SystemVer.Txt"

RETURN self

*********************************************************************************
** Método....: putVersaoFile()                                                  *
** Objetivo..: Escreve a versão do sistema no arquivo XML                       *
** Autor.....: Márcio Augusto Cezar                                             *
** Data......: 16/10/2008 17:43:11                                              *
*********************************************************************************
** Observação:                                                                  *
*********************************************************************************

METHOD putVersaoFile()

   LOCAL oHttp, oUrl

   IF file( ::cFileVersion )
      FErase( ::cFileVersion )
   ENDIF

   oUrl  := TUrl():New( ::getLink() )
   oHttp := TIPClient():New( oUrl )

   oHttp:nConnTimeout := 1000
   oHttp:nDefaultPort := 9600

   // Gravando no arquivo!
   ///////////////////////
   IF oHttp:Open()
      IF ! oHttp:ReadToFile( ::cFileVersion, FC_NORMAL, 300 )
        // msgStop( "Não foi possível criar o arquivo " + ::cFileVersion )
      ENDIF
   ENDIF

   IF oHttp <> Nil
      oHttp:Close()
   ENDIF

RETURN file( ::cFileVersion )

*********************************************************************************
** Método....: Execute()                                                        *
** Objetivo..: Executar os procedimentos da classe                              *
** Autor.....: Márcio Augusto Cezar                                             *
** Data......: 16/10/2008 17:27:39                                              *
*********************************************************************************
** Observação:                                                                  *
*********************************************************************************

METHOD execute( lViewDadosLink ) CLASS TCheckVersaoDisponivel

   LOCAL oFile, oXML, oNode, oIter
   LOCAL aLines := {}

   DEFAULT lViewDadosLink := .F.

   ::aOcorrencias := {}

   BEGIN SEQUENCE

      // Checando se existe conectividade com a internet
      //////////////////////////////////////////////////
      IF ! ChecaInternet( "www.simtechsistemas.com.br" )
         aAdd( ::aOcorrencias, "Não há conexão com a Internet" )
      ENDIF

      IF ! ::putVersaoFile()
        aAdd( ::aOcorrencias, "Não foi possível gravar o registro de versão no arquivo XML" )
      ENDIF

      TRY
        oFile := TTxtFile():new( ::cFileVersion )
      CATCH
        aAdd( ::aOcorrencias, "Erro na abertura do arquivo XML" )
      END

      IF FError() <> 0
        ::aAdd( ::aOcorrencias, "Erro na abertura do arquivo XML" )
      ENDIF

      IF len( ::aOcorrencias ) <> 0
         BREAK
      ENDIF

      WHILE ! oFile:lEof()

         aAdd( aLines, oFile:readLine() )

         oFile:Skip()

      ENDDO

      oFile:close()

      IF lViewDadosLink
         mytoString( aLines )
      ENDIF

   	IF len( aLines ) > 0

   		IF ! ( ::lSistemaAtivo := "ATIVO" $ upper( aLines[01] ) )
            BREAK
         ENDIF
   
         ::cNomeEmpresa  := aLines[02]
   
   	   FOR nX := 3 TO len( aLines )
   
   	       IF left( aLines[ nX ], 3 ) == ::cSiglaSistema
   	       	 ::cVersaoDisponivel     := subStr( aLines[ nX ], at( "-", aLines[ nX ] ) + 1 )
                ::cVersaoDisponivel     := alltrim( subStr( ::cVersaoDisponivel, 1, at( "-", ::cVersaoDisponivel ) - 1 ) )
   	       	 ::dDataVersaoDisponivel := ctod( alltrim( subStr( aLines[ nX ], rat( "-", aLines[ nX ] ) + 1 ) ) )
   	       ENDIF
   
   	   NEXT
   
   	ENDIF
   
      IF ( ::cVersaoDisponivel > ::cVersaoAtual .OR. ::dDataVersaoDisponivel > ::dDataVersaoAtual ) .OR. ::lForceVisualizacao
   
         // Exibindo a mensagem na tela
         //////////////////////////////
         ::dialogMensagem()

      ENDIF

   END SEQUENCE

RETURN ( len( ::aOcorrencias ) == 0 )


*********************************************************************************
** Método....: ajustaDialog()                                                   *
** Objetivo..: Ajustar posicionamento de uma determinada dialog em relação à    *
**             janela principal                                                 *
** Autor.....: Márcio Augusto Cezar                                             *
** Data......: 20/10/2008 - 16:25:22                                            *
*********************************************************************************
** Parâmetros: oDlg --> Objeto dialog que será ajustado                         *
*********************************************************************************
METHOD ajustaDialog( oDlg ) CLASS TCheckVersaoDisponivel

	LOCAL aCoorsWnd := { 0, 0 }
	LOCAL nTopWnd   := 0
	LOCAL nLeftWnd  := 0

	// ---> Recuperando as coordenadas da dialog e da janela pai
	////////////////////////////////////////////////////////////
	aCoorsWnd := clientToScreen( ::oWnd:hWnd, aCoorsWnd )
	nTopWnd   := ( ( aCoorsWnd[1] + ::oWnd:nHeight ) - oDlg:nHeight ) - 77
	nLeftWnd  := ( ::oWnd:nWidth() - oDlg:nWidth() ) - 8

	// ---> Posicionando a dialog
	/////////////////////////////
	oDlg:move( nTopWnd, nLeftWnd,,, .T. )

	::oWnd:setFocus()

RETURN

*********************************************************************************
** Método....: dialogMensagem()                                                 *
** Objetivo..: Configuração da dialog da mensagem                               *
** Autor.....: Márcio Augusto Cezar                                             *
** Data......: 20/10/2008 - 16:14:07                                            *
*********************************************************************************
** Observação:                                                                  *
*********************************************************************************

METHOD dialogMensagem() CLASS TCheckVersaoDisponivel

	LOCAL oDlg, oFont, oFont2, oLastDlg, oTimer, oLink
	LOCAL oObj := self
	LOCAL cColorBack  := 16768959
	LOCAL cColorText1 := CLR_BLACK
	LOCAL cColorText2 := CLR_BLUE
	LOCAL cColorText3 := 106

   // ---> Salvando a última janela ativa antes da mensagem
   ////////////////////////////////////////////////////////
   oLastDlg := oWndFromhWnd( getActiveWindow() )

	setResources( "Comum.Dll" )

	DEFINE DIALOG oDlg RESOURCE "CHK_NOVA_VERSAO" OF ::oWnd COLOR CLR_BLACK, cColorBack

      oFont  := TFont():New( "MS Sans Serif", 0, 15,, .T. )
      oFont2 := TFont():New( "Courier"      , 0, 12,, .T. )

      // ---> Criando o timer para close automatico da dialog
      ///////////////////////////////////////////////////////

      oTimer := TTimer():new( 10000, { || animateDlg( oDlg, "fadeOut",, .T. ), oTimer:end() }, oObj:oWnd )

		REDEFINE SAY ID 4001 OF oDlg COLOR 22784      , cColorBack FONT oFont  PROMPT ::cTituloDialog
		REDEFINE SAY ID 4002 OF oDlg COLOR cColorText1, cColorBack FONT oFont2 PROMPT ::cVersaoAtual
	   REDEFINE SAY ID 4003 OF oDlg COLOR cColorText1, cColorBack FONT oFont2 PROMPT ::dDataVersaoAtual
		REDEFINE SAY ID 4004 OF oDlg COLOR cColorText2, cColorBack FONT oFont2 PROMPT ::cVersaoDisponivel
	   REDEFINE SAY ID 4005 OF oDlg COLOR cColorText2, cColorBack FONT oFont2 PROMPT ::dDataVersaoDisponivel

      REDEFINE SAY ID 4006 OF oDlg COLOR cColorText3, cColorBack
      REDEFINE SAY ID 4007 OF oDlg COLOR cColorText3, cColorBack
      REDEFINE SAY ID 4008 OF oDlg COLOR cColorText3, cColorBack
      REDEFINE SAY ID 4009 OF oDlg COLOR cColorText3, cColorBack

      REDEFINE SAY ID 4010 OF oDlg COLOR CLR_BLACK, cColorBack
      REDEFINE URLLINK oLink ID 4011 URL "www.simtechsistemas.com.br" OF oDlg TOOLTIP "Click neste link para acessar a página da simtechsistemas Informática"

      oLink:SetColor( oLink:nClrInit, cColorBack )

	ACTIVATE DIALOG oDlg NOWAIT ON INIT ( oObj:ajustaDialog( oDlg ), oTimer:activate() )

	oFont:End()
	oFont2:End()

   // ---> Realizando o foco da última janela após a visualização de novas mensagens
   /////////////////////////////////////////////////////////////////////////////////
   IF oLastDlg <> NIL
      oLastDlg:setFocus()
   ELSE
      ::oWnd:setFocus()
   ENDIF

RETURN

*********************************************************************************
** Função....: animateDlg()                                                     *
** Objetivo..: Realizar uma determinada animação na dialog/window               *
** Autor.....: Márcio Augusto Cezar                                             *
** Data......: 20/10/2008 - 15:46:44                                            *
*********************************************************************************
** Parâmetros: oDlg --> Objeto dialog/window para controle da animação          *
**             cTipoAnimacao --> String contendo o tipo de animação a ser feita *
**                               de acordo com os tipos definidos pela API      *
**             nDuracao --> Velocidade a ser realizada a animação               *
**             lFechaDlg --> Expr. Lógica indicando se a Dialog/Window deverá   *
**                           ser finalizada                                     *
*********************************************************************************
** Retorno...: NIL                                                              *
*********************************************************************************
FUNCTION animateDlg( oDlg, cTipoAnimacao, nDuracao, lFechaDlg )

DEFAULT cTipoAnimacao := "fadeIn", ;
        nDuracao      := if( inArray( { "fadeOut", "fadeIn" }, cTipoAnimacao ), 1000, 200 ), ;
        lFechaDlg     := .F.

// ---> Realizando a animação apropriada, definida em cTipoAnimacao
///////////////////////////////////////////////////////////////////

IF ( cTipoAnimacao == "fadeIn" )

   animateWindow( oDlg:hWnd, nDuracao, AW_BLEND + AW_CENTER )

ELSEIF ( cTipoAnimacao == "fadeOut" )

  IF ( animateWindow( oDlg:hWnd, nDuracao, AW_BLEND + AW_HIDE ) == 0 )
     oDlg:hide()
  ENDIF

ELSEIF ( cTipoAnimacao == "toUp" )

   animateWindow( oDlg:hWnd, nDuracao, AW_VER_NEGATIVE )

ELSEIF ( cTipoAnimacao == "toDown" )

   animateWindow( oDlg:hWnd, nDuracao, AW_VER_POSITIVE )

ELSEIF ( cTipoAnimacao == "fromLeft" )

   animateWindow( oDlg:hWnd, nDuracao, AW_HOR_POSITIVE )

ELSEIF ( cTipoAnimacao == "fromRight" )

   animateWindow( oDlg:hWnd, nDuracao, AW_HOR_NEGATIVE )

ENDIF

// ---> Atualizando a dialog para objetos say/image
///////////////////////////////////////////////////
oDlg:refresh()

// ---> Verificando se a dialog deverá ser fechada
///////////////////////////////////////////////////
if( lFechaDlg, oDlg:end(), )

RETURN( NIL )

*********************************************************************************
** Função....: Funções de controle geral para Dialogs/Window a partir de API    *
** Autor.....: Márcio Augusto Cezar                                             *
** Data......: 13/06/2008 11:00:53                                              *
*********************************************************************************
DLL FUNCTION animateWindow( hWnd AS LONG, dwTime AS LONG, dwFlags AS LONG ) AS LONG PASCAL ;
FROM "AnimateWindow" LIB "user32.dll"

DLL FUNCTION findWndByClass( wndClass AS LPSTR, wndName AS LPSTR ) AS LONG PASCAL ;
FROM "FindWindowA" LIB "user32.dll"

*********************************************************************************
** Método....: inArray()                                                        *
** Objetivo..: Checa se determinado parâmetro encontra-se no array informado    *
** Autor.....: Márcio Augusto Cezar                                             *
** Data......: 20/10/2008 - 17:16:32                                            *
*********************************************************************************
** Observação:                                                                  *
*********************************************************************************

FUNCTION inArray( aVetor, uParametro, bBlocoCodigo )

   LOCAL lInArray := .F.

   DEFAULT uParametro   := "", ;
           aVetor       := {}, ;
           bBlocoCodigo := NIL

   IF bBlocoCodigo == NIL
      lInArray := ( ascan( aVetor, { | uParam | uParam == uParametro } ) > 0 )
   ELSE
      lInArray := ( ascan( aVetor, bBlocoCodigo ) > 0 )
   ENDIF

RETURN( lInArray )

 

Esta função checa se existe uma versão disponível no ftp e apresenta uma notificação no try. Você pode adaptar pra você.

Obrigado meu amigo.

Vou dar uma estudada aqui.

Valeu.

Um abraço,

Alexandre Pereira

Link to comment
Share on other sites

4 horas atrás, alex2002 disse:

Olá meu amigo.

Na verdade o que a classe faz é um menu, eu queria que na notificação me desse a oportunidade de executar uma função, quando clicado. Exatamente os antivírus, atualizações nos permitem fazer. 

Enfim, vou notificar o usuário com shellnotify e se o cara clicar executaria uma determinada função. Creio não ser possível porque a o shellnotify na verdade é uma function das DLLs do windows, por isso acho não ser possível. Mas de qualquer forma, se existir estamos dentro.

Um abraço,

Alexandre Pereira

O Exemplo peguei do Fivewin, no caso exibe um menu, vc pode sim implementar e fazer o que vc desejar, acrescentado na sua rotina timer,  ele fica monitorando, em um intervalo de tempo desejado,  por exemplo, uma versão nova no servidor ou qq outra informação e se desejar, além da notificação, poderá exibir uma tela para tal processamento. 

Link to comment
Share on other sites

Fácil. Apenas use TTrayIcon da forma correta (acho que ninguém entendeu o que precisa).

Se quiser a minha consultoria/solução, meus dados e-mail/Messenger (neste caso, sem taxa do orçamento).

Atenciosamente,
Site | Facebook | YouTube

Em 20/07/2022 at 00:51, alex2002 disse:

Olá PessoALL,

Alguém saberia me dizer se consigo fazer uma associação de uma função xHarbour para ser utilizada na notificação do Windows (aquela mesma do tray já comentado aqui no grupo)?

Pergunto pois, se o sistema notificar o usuário dentro do sistema, queria abrir uma janela caso o usuário clique na notificação. Exatamente igual existe para atualizações do Java, etc.

Não sei se é possível, mas se for será de granda valia pra mim.

Um abraço,

Alexandre Pereira

 

 

Link to comment
Share on other sites

Em 23/07/2022 at 15:46, Eric.Developer disse:

Fácil. Apenas use TTrayIcon da forma correta (acho que ninguém entendeu o que precisa).

Se quiser a minha consultoria/solução, meus dados e-mail/Messenger (neste caso, sem taxa do orçamento).

Atenciosamente,
Site | Facebook | YouTube

 

se nao vai cobrar, compartilha aqui então, pode ter mais pessoas interessadas, e acrescenta em muito para o forum... ;)

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...