Jump to content
Fivewin Brasil

alex2002

Membros
  • Posts

    1,229
  • Joined

  • Last visited

  • Days Won

    24

Posts posted by alex2002

  1. Olá pessoal.

    O tópico é pra saber se algum amigo do grupo tem uma impressora da lista pra vender. Tem uma amiga que está precisando e daí vi aqui que muita gente trabalha com isso, se por acaso alguem tiver, favor entrar em contato comigo no email: alexandre@declatecnologia.com.br

    As impressoras compatíveis com o sistema dela estão na imagem.

    Lembrando que ela precisa comprar uma destas impressoras (para impressão de etiquetas para semi jóias)

    Obrigado a todos.

    Alexandre Pereira
     

    Captura de tela 2022-09-21 103645.jpg

  2. Olá Edu.

    Cara, de referência internacional são Amazon e Digital Ocean.

    Eu tenho usado a KingHost (brasileira) desde 2010. Eles também tem CLOUD lá, não tenho o que reclamar.

    Fui para a KingHost em 2010 exatamente por causa da Locaweb. Só tinham propaganda, hoje não sei como estão, mas de acordo com você continua a mesma coisa.

     

    Um abraço,

    Alexandre Pereira

  3. Fala Luiz, 

    Quanto tempo rapaz?

    Cara, sugiro pular fora dessa DLL até porque os bancos hoje estão usando API para fazer registros, etc.

    Me parece que a ACBR tem algo, mas não tenho certeza.

    Um abraço meu amigo.

    Alexandre Pereira

     

  4. 9 horas atrás, MAMP2 disse:

    ou existe alguma funcao que trasnforma UTF-8 em ASCII (encorde)? alguem tem?

     

     
    Bom, talvez vc esteja usando o modo diferente do que eu uso: Tente OemToAnsi(), AnsiToOem()....


    Enfim, mas vou te enviar a minha que foi feito na unha pra tirar os acentos.


    Um abraço,

    Alexandre Pereira
     
     
    ////////////////////////////DADOS DA FUNCAO////////////////////////////////////////////
    // NOME       : TiraAcentoUTF                                                        //
    // SINTESE    : Retirar acentos e cedilhas                                           //
    // PARAMETROS : <1> cTexto para retirar os acentos                                   //
    // RETORNO    : cTexto sem acentos ou cedilhas                                       //
    ///////////////////////////////////////////////////////////////////////////////////////
    function TiraAcentoUTF( cTexto )
     
    cTexto := StrTran(cTexto,"ã","a")
    cTexto := StrTran(cTexto,"ä","a")
    cTexto := StrTran(cTexto,"à","a")
    cTexto := StrTran(cTexto,"á","a")
    cTexto := StrTran(cTexto,"ª","a")
    cTexto := StrTran(cTexto,"â","a")
    cTexto := StrTran(cTexto,"¦","a")
    cTexto := StrTran(cTexto,"è","e")
    cTexto := StrTran(cTexto,"é","e")
    cTexto := StrTran(cTexto,"ê","e")
    cTexto := StrTran(cTexto,"ë","e")
    cTexto := StrTran(cTexto,"ì","i")
    cTexto := StrTran(cTexto,"í","i")
    cTexto := StrTran(cTexto,"î","i")
    cTexto := StrTran(cTexto,"ï","i")
    cTexto := StrTran(cTexto,"ò","o")
    cTexto := StrTran(cTexto,"§","o")
    cTexto := StrTran(cTexto,"õ","o")
    cTexto := StrTran(cTexto,"ö","o")
    cTexto := StrTran(cTexto,"ó","o")
    cTexto := StrTran(cTexto,"º","o")
    cTexto := StrTran(cTexto,"ô","o")
    cTexto := StrTran(cTexto,"õ","o")
    cTexto := StrTran(cTexto,"ø","o")
    cTexto := StrTran(cTexto,"ù","u")
    cTexto := StrTran(cTexto,"ú","u")
    cTexto := StrTran(cTexto,"ü","u")
    cTexto := StrTran(cTexto,"û","u")
    cTexto := StrTran(cTexto,"ç","c")
                               
                               
    cTexto := StrTran(cTexto,"Ã","A")
    cTexto := StrTran(cTexto,"Ä","A")
    cTexto := StrTran(cTexto,"À","A")
    cTexto := StrTran(cTexto,"Á","A")
    cTexto := StrTran(cTexto,"Â","A")
    cTexto := StrTran(cTexto,"È","E")
    cTexto := StrTran(cTexto,"Ë","E")
    cTexto := StrTran(cTexto,"É","E")
    cTexto := StrTran(cTexto,"Ê","E")
    cTexto := StrTran(cTexto,"Ì","I")
    cTexto := StrTran(cTexto,"Í","I")
    cTexto := StrTran(cTexto,"Î","I")
    cTexto := StrTran(cTexto,"Ï","I")
    cTexto := StrTran(cTexto,"Ò","O")
    cTexto := StrTran(cTexto,"Õ","O")
    cTexto := StrTran(cTexto,"Ó","O")
    cTexto := StrTran(cTexto,"Ô","O")
    cTexto := StrTran(cTexto,"Ö","O")
    cTexto := StrTran(cTexto,"Ù","U")
    cTexto := StrTran(cTexto,"Ú","U")
    cTexto := StrTran(cTexto,"Ü","U")
    cTexto := StrTran(cTexto,"Û","U")
    cTexto := StrTran(cTexto,"Ç","C")
     
    cTexto := StrTran(cTexto,"«"," ")
    cTexto := StrTran(cTexto,"®"," ")
    cTexto := StrTran(cTexto,"?"," ")
    cTexto := StrTran(cTexto,"¬"," ")
    cTexto := StrTran(cTexto,"¯"," ")
    cTexto := StrTran(cTexto,"ý"," ")
    cTexto := StrTran(cTexto,","," ")
    cTexto := StrTran(cTexto,"'"," ")
    cTexto := StrTran(cTexto,"`"," ")
    cTexto := StrTran(cTexto,"/"," ")
    cTexto := StrTran(cTexto,"\"," ")
    return cTexto
     
     
  5. 17 horas atrás, sygecom disse:

    Bom dia Alê,

    Lembro de você em um evento do Fivewin que aconteceu em Minas, acho que no SESC, foi top aquele evento, por aqui tudo corrido e por ai ? tudo bem ?

     

    Segue abaixo o exemplo, como eu disse não está 100% mas da para partir dai para fazer algo bem legal.

    
    FUNCTION MyManualReport( cTXT2FR3 )
    /*
    Recebe por parâmetro o arquivo .txt ou .prn para mostrar na tela do fastreport
     exemplo: c:\syg_temp\relatorio.txt
    */
    local oFrPrn
    
    IF !FILE(cTXT2FR3)
       ShowMsg("Erro ao localizar o arquivo para impressão " +cTXT2FR3 )
       RETURN(.F.)
    ENDIF   
    
    oFrPrn := frReportManager():new()
    
    //oFrPrn:LoadLangRes(PEGA_ARQUIVO_SAGI(1,.T.)) // aqui é o icone da tela
    oFrPrn:PreviewOptions:SetShowCaptions(.T.)
    oFrPrn:SetIcon(1001)
    oFrPrn:SetTitle("Visualizador de Relatórios do Sistema.")
    
    oFrPrn:StartManualBuild( { || MyManualReport2(oFrPrn,cTXT2FR3) }, FR_LANDSCAPE, , FR_PIXELS )
    
    oFrPrn:PrepareReport()
    oFrPrn:ShowPreparedReport()
    
    oFrPrn:Clear()
    oFrPrn:DestroyFR()     // detona com o fastreporte e a dll da memoria.
    oFrPrn:=nil
    
    RETURN(.t.)
    
    FUNCTION MyManualReport2(oFrPrn,cTXT2FR3)
    /*
    Exemplo de uso sem arquivo .FR3
    */
    local tmp_Name:='', cText_ARQ:='', nLINES:=0, nA:=0, nINIT_LINE:=0, cIMPTEXT:=''
    //local cLOGO:=ARQUIVOLOGOMARCA() // pega o logotipo do cliente para mostrar no relatorio
    local cLOGO:=''
    
       oFrPrn:SetDefaultFontProperty( "Name", "Arial" )
       oFrPrn:SetDefaultFontProperty( "Size", 10 )
    
       IF !EMPTY(cLOGO)
          oFrPrn:PictureAt( cLOGO , 30, 200, 150, 150 )
          nINIT_LINE:=300
       ENDIF
       
       cText_ARQ := memoread( cTXT2FR3 ) // carrega o TXT
    
       nLINES := mlcount( cText_ARQ, 250 ) // total de linhas
       FOR nA := 1 to nLINES
          cLINE := MEMOLINE( cText_ARQ, 250, nA, 1, .F., .T. )
          
          IF Left(AllTrim( cLine ), 1 ) == Chr( 15 ) .or. Left( AllTrim(cLine), 1 ) == Chr( 18 )
             loop
          ENDIF
    
          If Left(AllTrim(cLine),1)==Chr(12) //SALTO DA PAGINA
             LOOP
             //oFrPrn:NewPage()
          ENDIF
          
          IF AT('[',cLine)>0 .OR. AT(']',cLine)>0
             cLine:=Stuff(cLine, AT('[',cLine),1,'-')
             cLine:=Stuff(cLine, AT(']',cLine),1,'-')
          ENDIF
          
          IF !EMPTY(ALLTRIM(cLINE)) 
    
             //oFrPrn:MemoAt(cLINE, 100, (nA*100)+nINIT_LINE, 350, 50 )
             nINIT_LINE:=0
             cIMPTEXT:=cIMPTEXT+cLINE+CR_LF
             //MemoAt(cStr, nLeft, nTop, nWidth, nHeight)
          ENDIF   
       NEXT
       oFrPrn:MemoAt(cIMPTEXT, 10, 350, 1500, 1500 )
    
       
    *   tmp_Name := oFrPrn:MemoAt( "Some memo with bottom frame ...", 30, 30, 300, 50 )
    *   oFrPrn:SetManualObjProperty( tmp_Name + ".Frame", "Typ", "[ftBottom]" )
    
    //   oFrPrn:LineAt( 30, 200, 100, 100 )
    //   oFrPrn:MemoAt( "<-- It's a some line ...", 200, 250, 350, 50 )
    
    
    //   oFrPrn:NewPage()
    
     //  oFrPrn:MemoAt( "It's a second page..................", 30, 30, 100, 1000 )
    
    RETURN(.T.)

     

    Olá meu amigo, que memória hein?  Foi isso mesmo.

    Tudo bem por aqui e muito obrigado pelo exemplo.

    Um abraço,

    Alexandre Pereira

     

  6. 3 horas atrás, sygecom disse:

    @alex2002

    Tenho um exemplo que não está 100% que lê relatórios em TXT para gerar em FASTREPORT, se isso ajuda posso postar aqui.

    Opa, posta aí então meu amigo.

    Por falar nisso, vc está sumido. Uso até hoje aquela dica de instalação do MySQL que vc me passou (instalar pelo próprio aplicativo).

    Um abraço,

    Alexandre Pereira

  7. Segue a rotina de consulta externa.

     

     
    ////////////////////////////////////////////////////////////////////////////////////////////
    // NOME       : BuscaCepOnLine                                                            //
    // SINTESE    : Procura nos correios um CEP e retornar array                              //
    // PARAMETROS : cCEP              // 1 - Número do CEP                                    //
    //              @aRetorno         // 2 - Array ( Logradouro, Bairro, Cidade, UF )         //
    // RETORNO    : lAchou                                                          Alexandre //
    ////////////////////////////////////////////////////////////////////////////////////////////
    Function BuscaCepOnLine( cCep, aRetorno )
     
    local oCon, cMsg, cComando, cBuffer, cLogradouro, cBairro, cCidade, cUF
    local hJson
    local lRetorno := .t.
    local nLen
     
    hJson := {=>}
    cMsg  := ''
    cCep  := SoNumeros( cCep )
     
    try
       oCon     := CreateObject("Microsoft.XMLHTTP")
    catch oError
       cMsg     := oError:description
       lRetorno := .f.
    end
     
    if lRetorno
       cComando := 'https://viacep.com.br/ws/'+cCep+'/json/'
       try
          oCon:Open("GET", cComando,.f.)
       catch oError
          cMsg     := oError:description
          lRetorno := .f.
       end
    endif
     
    if lRetorno
       try
          oCon:Send()
       catch oError
          cMsg     := oError:description
          lRetorno := .f.
       end
    endif
     
    if lRetorno
       hJson    := {}
       cBuffer  := oCon:responseBody
       nLen     := hb_jsonDecode( cBuffer , @hJson )
     
       if nLen = 0
          cMsg   := "Erro"
           hJson := {=>}
       endif
     
       if !empty( hJson ) .and. HhasKey( hJson, 'logradouro' )
          cLogradouro := hJson['logradouro']
       endif
       if !empty( hJson ) .and. HhasKey( hJson, 'bairro' )
          cBairro := hJson['bairro']
       endif
       if !empty( hJson ) .and. HhasKey( hJson, 'localidade' )
          cCidade := hJson['localidade']
       endif
       if !empty( hJson ) .and. HhasKey( hJson, 'uf' )
          cUF := hJson['uf']
       endif
    endif
     
    if empty( cLogradouro ) .or.  empty( cBairro ) .or. empty( cCidade ) .or. empty( cUF )
       lRetrono := .f.
       aRetorno := {'','','',''}
    else
       lRetorno := .t.
       aRetorno := { TiraAcentoUTF(cLogradouro), TiraAcentoUTF(cBairro), TiraAcentoUTF(cCidade), cUF }
    endif
     
    if !empty( cMsg )
       MsgStop( 'Não foi possível obter o CEP pelos correios!','Erro')
    endif
     
    return lRetorno
     
  8. 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

  9. 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

  10. 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

     

  11. Não tem problema, o memoread lê tranquilamente, não deixa de ser um arquivo. Leio aruqivos de imagens e outros mais através dele.

    Mas se o arquivo é gerado por vc, neste caso fica até mais fácil.

    Acho que o caminho é esse.

    Um abraço,

    Alexandre Pereira

     

  12. 10 horas atrás, lucimauromelo disse:

    Pelo navegador ou pela tela do terminal service?

    Pelo navegador. Mas tem opção de instalar o Client tbm. Porém este Client não é o da Micro$oft

    Ontem mostrei para o Marcelo (Marca) o meu sistema funcionando. Ele ficou muito satisfeito com a velocidade e a facilidade.

  13. 58 minutos atrás, Theotokos disse:

    deixa ver se entendi! Com TSPlus o meu cliente pode ter uma maquina com servidor (onde ficaria então todos os programas disponiveis para os usuarios) e as outras lojas (filiais) pode acessar através do TSPlus por um navegador, e utilizar o programa desktop da loja? 

    exatamente

     

  14. Em 21/05/2022 at 18:01, lucimauromelo disse:

    Eu venho acompanhando eles nos podcast do projetoacbr  falando muitos sobre os TSPLUS me parece bem fácil de instalar, quanto aos preços voce poderiao nos dar um exemplo aqui. pelo que  entendi os servidores são seus ou são dos clientes mesmo.

    No nosso caso, os servidores são nossos. Mas pode colocar onde quer que seja. Quanto às licenças, no site já tem os preços para o consumidor, mas existe uma parceria com a representante aqui no Brasil onde empresas de desenvolvimento podem pagar mensalmente por cliente. No nosso caso, estamos pagando R$ 20,00 por cliente com o mínimo de 10 clients. 

    Acho a proposta deles extremamente bacana.

     

  15. Olá pessoal,

    Sempre tem gente perguntando como colocar o aplicativo pra rodar no navegador. Pois bem, estávamos estudando uma solução mais barata para os nossos clientes ao utilizar o Terminal Server (não tem nada a ver com aplicativo por navegador), e nos deparamos com a ferramenta TSPLUS. Além de ter os clients infinitamente mais barato que o Terminal Server da Micro$oft, ele tem também a opção de acessar e rodar o ERP pelo navegador. Montamos dois servidores através do Hyper V e disponibilizamos para rodar em dois clientes diferentes. Estamos simplesmente fascinados com o resultado, até os clientes estão preferido utilizar ao invés de usar o TS da Micro$oft.

    Fica a dica aí, ferramente extremamente eficiente e creio que vai resolver o problema de muita gente. A configuração é extremamente simples e você coloca a saída da forma que quiser, se quiser colocar a área de trabalho é possível, se quiser colocar apenas um app é possível, enfim são muitas possibilidades e muito simples de configurar. Além de ter as ferramentas de defesas que tbm são muito bacana.

    Fica a dica.

    Um abraço,

    Alexandre Pereira

  16. Bom dia

     

    ///

       oWS                := WebConnect():New()
       cTexto             := ' '
       cUser              := 'nomedousuario'
       cSenha             := 'senhaenviadapelazenvia'
       cTelefone          := '5531991143593'
       cMensagem          := 'Mensagem de Teste'
     
         cTexto    := oWS:Open( 'https://api-http.zenvia.com/GatewayIntegration/msgSms.do?account='+cUser+'&code='+cSenha+'&dispatch=send&to='+cTelefone+'&msg='+cMensagem )
     
          if len( cTexto ) >= 3 .and. substr(cTexto,1,3) = '000'
             lRetorno := .t.
          elseif len( cTexto ) >= 3 .and. substr(cTexto,1,3) = '990'
             MsgStop('Erro ao enviar SMS, possivelmente estourou a cota!'+CRLF+cTexto,'Erro' )
             lRetorno := .f.
          elseif len( cTexto ) >= 3 .and. substr(cTexto,1,3) = '900'
             MsgStop('Erro ao enviar SMS, Erro de Autenticação!'+CRLF+cTexto,'Erro' )
             lRetorno := .f.
          else
             lRetorno := .f.
          endif
     
       syswait(.2)
       sysrefresh()
       oWS:end()

    ////


    Trecho do meu código

    Deve te ajudar

    Um abraço,

    Alexandre Pereira
×
×
  • Create New...