Página 4 de 4

Executar programa sem janela (invisível)

Enviado: 29 Set 2012 13:02
por cjp
Deu certo, meu caro, muito obrigado. Que maravilha!!! Muito obrigado mesmo.

Ainda falta resolver a questão da impressora. Vc saberia me dizer como fazer pra imprimir?

Executar programa sem janela (invisível)

Enviado: 29 Set 2012 16:53
por Jairo Maia
Olá Inácio,
cjp escreveu:Deu certo, meu caro, muito obrigado. Que maravilha!!! Muito obrigado mesmo.
Legal. Mais um problema resolvido.

Quanto a impressão:
Como você faz a impressão hoje? Dê detalhe pra que possamos saber, ou seja, como você envia os dados para impressão?

Resolvido o principal, creio que para podermos lhe ajudar com a questão da impressão, necessariamente você precisa dizer COM DETALHES como você envia a impressão em seu sistema.

Executar programa sem janela (invisível)

Enviado: 29 Set 2012 18:30
por cjp
Estou fazendo assim pra imprimir, meu caro:

Código: Selecionar todos

         set printer to "Lexm332n"
         set devi to print
         disp data,hora,tarefa all to print off
         eject
         set printer to
         set devi to screen
Tem um outro probleminha: quando o programa acessa o outro programa sem janela própria, do jeito que vc me ensinou (hb_run("start /b tar2p.exe")), a tela do programa principal perde a sua configuração original de cores, ficando preta (sendo que a tela deste programa tar2p que abre está sem definição de cores, pois ela não deveria aparecer). Tem algum jeito de resolver isso?

Executar programa sem janela (invisível)

Enviado: 29 Set 2012 19:55
por Jairo Maia
Olá Inácio,
cjp escreveu:a tela do programa principal perde a sua configuração original de cores
Bom, quando você usa a forma que passei, o executável irá rodar invisível e com o programa que o chamou liberado para trabalho, sem nenhuma interferência enquanto o programa invisível estiver trabalhamdo. Não consigo entender o que está ocorrendo. Para ficar mais claro, pressione um PrintScreen, salve a tela e anexe aqui pra podermos ver de que forma ela fica, e tentar entender o que pode estar ocorrendo.

Quanto a impressão, vou passar um pequeno exemplo, que imprime diretamente na impressora que estiver selecionada como padrão no Windows. Tente adaptar a seu sistema:

Código: Selecionar todos

Function PrintDados( cDados )
 Local oPrn := Win_Prn():New( Win_PrinterGetDefault() )

 cDados := If( cDados = Nil, "Teste de impressao", AnsiToOem( cDados ) )

 If !oPrn :Create()
  Hb_alert("Nao foi criado o documento de ImpressÆo")
  Return nil
 ElseIf !oPrn :StartDoc("Imprimindo Documento")
  Hb_alert("Erro na Impressora")
  Return nil
 EndIf

 oPrn :NewLine()
 oPrn :TextOut( cDados )

 oPrn :EndDoc()
 oPrn :Destroy()

Return Nil

Executar programa sem janela (invisível)

Enviado: 29 Set 2012 21:18
por cjp
Fiquei com uma dúvida na sua função de impressão: como passo cDados para ela? Parece que ela é uma string caractere. Se eu quero passar vários campos da base pra ela imprimir, como faço?

E ela está dando um erro na compilação referente à função AnsiToOem( cDados ). O erro é o seguinte: undefined reference to HB_FUN_ANSITOOEM. collect2: ld returned exit status.

Quanto à tela, primeiro aí vai a tela normal do programa:

Imagem

E agora a tela do programa quando executo o tar2p:

Imagem

Note que ela inclusive muda o "título" da tela, incluindo o tar2p no título. Inclusive, se houver como tirar isso do título depois que ela acaba de rodar, eu agradeço sua ajuda, porque eu uso o WAPI para verificar se a função tar2p está rodando, e desse jeito eu não tenho como saber.

E ainda, se eu colocar um SET COLOR TO W/B,b/w no princípio do tar2p, mesmo assim a tela fica preta (isso eu não entendi por que).

Aparentemente, ele coloca a tela do tar2p dentro da tela do programa principal, sem contudo exibir o que ali se passa.

Percebi também que a tela do programa principal fica "presa" enquanto está executando o tar2p. Embora ela fique liberada para fazer o que eu quiser no programa, ela não permite fechar a tela. Veja o que acontece:

Imagem


Mais uma vez obrigado por sua ajuda.

Inacio

Executar programa sem janela (invisível)

Enviado: 30 Set 2012 09:38
por Jairo Maia
Olá Inácio,
cjp escreveu:E agora a tela do programa quando executo o tar2p
Não sei o que causa esta mudança de cor. Realmente não tenho a menor idéia. Não sei inclusive se está relacionado a alguma função WAPI.
cjp escreveu:1 - Note que ela inclusive muda o "título" da tela, incluindo o tar2p
2 - Percebi também que a tela do programa principal fica "presa" enquanto está executando o tar2p
Sim. Você tem que abondonar o uso da batch (.BAT) que você está usando pra carregar o TAR2P. O que está mostrado nas figuras, é a tela do DOS aberta pelo .BAT.

Voce deve usar a chamada diretamente ao executável para que ele fique invisível, e se o uso do .BAT é porque você precisa passar parâmetros, passe-os diretamente pelo comando Hb_run(). O comando que passei, não funcionará se você usar um batch. Deve ser direto. É a tela do batch que fica presa, e não do TAR2P.EXE. Quando se chama diretamente o executável, o programa principal fica liberado e pode ser fechado sem prejuízo do programa invisível.
cjp escreveu:está dando um erro na compilação referente à função AnsiToOem( cDados )
Aqui foi um erro meu. Onde escrevi: AnsiToOem( cDados ), corrija para: Hb_AnsiToOem( cDados )
cjp escreveu:Se eu quero passar vários campos da base pra ela imprimir, como faço?
Primeiro precisamos entender o que você quer imprimir. Considerando a sua função de impressão postada acima, o que deve ser impresso? São todos os registros de deteminada data? Qual o tipo da variável data, hora e tarefa?

Executar programa sem janela (invisível)

Enviado: 30 Set 2012 17:55
por cjp
Perfeito, meu caro. Funcionou sim.

O .bat era para para descompactar eventual nova versão do programa. É que, quando eu mudo alguma coisa no programa, eu mando (via FTP) um arquivo .RAR com o novo .exe compactado. Daí o .bat verifica se existe o arquivo .rar e, se tiver, ele descompacta, gerando o novo .exe, e depois inicia o programa.

Mas eu dou outro jeito de fazer isso.

Chamando diretamente o .exe, funciona perfeitamente. Inclusive o problema da cor da tela não dá mais. Agora sim, está perfeito. Muito obrigado.

É verdade que a tela continua "presa". Ela não fecha enquanto não acabar de rodar o tar2p, mesmo sendo ele chamado direto no .exe. Mas não tem problema. Até porque ele não demora muito pra fechar.

Resolveu também a questão do título da janela. Não está mais aparecendo o tar2p. O problema é que, assim, eu não tenho como saber quando ele acaba de executar. Será que tem um jeito?

Quanto à impressão, funcionou agora, tá compilando sem problema.

Quanto ao campo que vc perguntou, varia muito o campo da base. No exemplo que te passei, os campos data, hora e tarefa, são, respectivamente, campos data, caractere e caractere. Mas em outros pontos do programa podem ser outros campos da base.

Fiz os seguintes testes: se imprimo qualquer campo caractere (printdados(campo-caractere)), ele imprime corretamente; se imprimo qualquer outro tipo de campo (printdados(campo-numérico) ou printdados(campo-data)...), ele imprime uma folha em branco; se transformo o campo não caractere em campo caractere (printdados(str(campo-numérico)) ou printdados(dtoc(campo-data))), ele imprime normalmente.

O que eu não estou entendendo é como vou imprimir vários campos de base (quaisquer que sejam) por esse método. Até agora eu faria: disp data,hora,tarefa for recno()>10 .and. recno()<20, por exemplo. Ele imprimiria todos os campos no intervalo. Com a tua função, como vou fazer isto? Se eu colocar um printdados(dtoc(data)+hora+tarefa) para cada registro da base, mesmo usando um loop, ele irá imprimir um registro em cada folha, não é?

Além disso: como farei pra imprimir um relatório grande desta forma, inclusive "desenhando" a impressão com quadros, por exemplo?

Outra dúvida: vi que esta função usa a impressora padrão do Windows. Tem como escolher outra impressora instalada?

Mais uma vez muito obrigado.

Executar programa sem janela (invisível)

Enviado: 30 Set 2012 23:45
por cjp
Um outro problema que estou enfrentando no Harbour: o errorsys.prg que eu havia modificado, por recomendação de alguém daqui do grupo, e que funcionava bem no xharbour, não está funcionando no harbour. Veja o erro que tá dando:

Código: Selecionar todos

Application Internal Error - C:\tarefas\tarefas.exe
Terminated at: 2012.09.30 22:52:24
Erro irrecuper vel 9003: Muitas chamadas recursivas ao manipulador de erros
Called from ERROR:PROCNAME(0)
Called from DEFERROR(89) in ERRORSYS.PRG
Called from (b)ERRORSYS(73) in ERRORSYS.PRG
Called from ERROR:PROCNAME(0)
Called from DEFERROR(89) in ERRORSYS.PRG
Called from (b)ERRORSYS(73) in ERRORSYS.PRG
Called from ERROR:PROCNAME(0)
Called from DEFERROR(89) in ERRORSYS.PRG
Called from (b)ERRORSYS(73) in ERRORSYS.PRG
Called from ERROR:PROCNAME(0)
Called from DEFERROR(89) in ERRORSYS.PRG
Called from (b)ERRORSYS(73) in ERRORSYS.PRG
Called from ERROR:PROCNAME(0)
Called from DEFERROR(89) in ERRORSYS.PRG
Called from (b)ERRORSYS(73) in ERRORSYS.PRG
Called from ERROR:PROCNAME(0)
Called from DEFERROR(89) in ERRORSYS.PRG
Called from (b)ERRORSYS(73) in ERRORSYS.PRG
Called from ERROR:PROCNAME(0)
Called from DEFERROR(89) in ERRORSYS.PRG
Called from (b)ERRORSYS(73) in ERRORSYS.PRG
Called from LOGERROR(296) in ERRORSYS.PRG
Called from DEFERROR(209) in ERRORSYS.PRG
Called from (b)ERRORSYS(73) in ERRORSYS.PRG
Called from MANDMAIL1(14758) in COMUNS.PRG
Called from TAREFAS(260) in TAREFAS.PRG
Called from MAIN(6) in TAREFAS.PRG
O errorsys que eu modifiquei (em poucos pontos) tá assim:

Código: Selecionar todos

/*
 * $Id: errorsys.prg,v 1.60 2009/02/23 21:00:20 ronpinkas Exp $
 */

/*
 * Harbour Project source code:
 * The default error handler
 *
 * Copyright 1999 Antonio Linares <alinares@fivetech.com>
 * www - http://www.harbour-project.org
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2, or (at your option)
 * any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this software; see the file COPYING.  If not, write to
 * the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
 * Boston, MA 02111-1307 USA (or visit the web site http://www.gnu.org/).
 *
 * As a special exception, the Harbour Project gives permission for
 * additional uses of the text contained in its release of Harbour.
 *
 * The exception is that, if you link the Harbour libraries with other
 * files to produce an executable, this does not by itself cause the
 * resulting executable to be covered by the GNU General Public License.
 * Your use of that executable is in no way restricted on account of
 * linking the Harbour library code into it.
 *
 * This exception does not however invalidate any other reasons why
 * the executable file might be covered by the GNU General Public License.
 *
 * This exception applies only to the code released by the Harbour
 * Project under the name Harbour.  If you copy code from other
 * Harbour Project or Free Software Foundation releases into a copy of
 * Harbour, as the General Public License permits, the exception does
 * not apply to the code that you add in this way.  To avoid misleading
 * anyone as to the status of such modified files, you must delete
 * this exception notice from them.
 *
 * If you write modifications of your own for Harbour, it is your choice
 * whether to permit this exception to apply to your modifications.
 * If you do not wish that, delete this exception notice.
 *
/*
 * The following parts are Copyright of the individual authors.
 * www - http://www.harbour-project.org
 *
 * Copyright 2001 Ron Pinkas <ron@profit-master.com>
 *    TraceLog()
 *    CStr()
 * Copyright 2002 Luiz Rafael Culik <culikr@uol.com.br>
 *    StrValue()
 *    FWriteLine()
 *    LogError()
 */

#include "common.ch"
#include "error.ch"
#include "fileio.ch"
#include "set.ch"

REQUEST Select,Alias,RecNo,DbFilter,DbRelation,IndexOrd,IndexKey

PROCEDURE ErrorSys

     Errorblock( { | oError | DefError( oError ) } )

Return

STATIC FUNCTION DefError( oError )
   LOCAL cMessage
   LOCAL cDOSError

   LOCAL aOptions
   LOCAL nChoice

   LOCAL n

   n := 0
   WHILE ! Empty( ProcName( ++n ) )
      IF ProcName( n ) == ProcName()
         TraceLog( "Error system failure!", oError:ProcName, oError:ProcLine(), oError:ModuleName, oError:description )
*         Alert( "Error system failure!;Please correct error handler:;" + oError:ProcName + "(" + LTrim( Str( oError:ProcLine() ) ) +  ") in module: " + oError:ModuleName )
         ErrorLevel( 1 )
         QUIT
      ENDIF
   ENDDO

   // By default, division by zero results in zero
   IF oError:genCode == EG_ZERODIV
      RETURN 0
   ENDIF

   // By default, retry on RDD lock error failure */
   IF oError:genCode == EG_LOCK .AND. ;
      oError:canRetry
      // oError:tries++
      RETURN .T.
   ENDIF

   // Set NetErr() of there was a database open error
   IF oError:genCode == EG_OPEN .AND. ;
      oError:osCode == 32 .AND. ;
      oError:canDefault
      NetErr( .T. )
      RETURN .F.
   ENDIF

   // Set NetErr() if there was a lock error on dbAppend()
   IF oError:genCode == EG_APPENDLOCK .AND. ;
      oError:canDefault
      NetErr( .T. )
      RETURN .F.
   ENDIF

   // Making sure we display the error info!
   DO WHILE DispCount() > 0
      DispEnd()
   ENDDO

   cMessage := ErrorMessage( oError )
   If !Empty( oError:osCode )
      cDOSError := "(DOS Error " + Ltrim( Str( oError:osCode ) ) + ")"
   Endif


   If ValType( oError:Args ) == "A"
     cMessage += " Arguments: (" + Arguments( oError ) + ")"
   Endif

   // Build buttons

   IF MaxCol() > 0
       aOptions := {}

       // AAdd( aOptions, "Break" )
       Aadd( aOptions, "Quit" )

       If oError:canRetry
          Aadd( aOptions, "Retry" )
       Endif

       If oError:canDefault
          Aadd( aOptions, "Default" )
       Endif

       // Show alert box
       //TraceLog( cMessage )

       nChoice := 1

       While nChoice == 0

          If Empty( oError:osCode )
             nChoice := Alert( cMessage, aOptions )
          Else
             nChoice := Alert( cMessage + ";" + cDOSError, aOptions )
          Endif

       Enddo

       IF ! Empty( nChoice )
          DO CASE
          CASE aOptions[ nChoice ] == "Break"
             Break( oError )
          CASE aOptions[ nChoice ] == "Retry"
             RETURN .T.
          CASE aOptions[ nChoice ] == "Default"
             RETURN .F.
          ENDCASE
       ENDIF
   ELSE
      IF Empty( oError:osCode )
         nChoice := Alert( cMessage + ";" + oError:ProcName + "(" + LTrim( Str( oError:ProcLine() ) ) +  ") in module: " + oError:ModuleName )
      ELSE
         nChoice := Alert( cMessage + ";" + cDOSError + ";" + oError:ProcName + "(" + LTrim( Str( oError:ProcLine() ) ) +  ") in module: " + oError:ModuleName )
      ENDIF
   ENDIF
if us#"Y" .and. us#"G" .and. us#"E" .and. at("TAR2P",upper(procname(0)))=0  .and. at("TAR2P",upper(procname(1)))=0 .and. at("TAR2P",upper(procname(2)))=0 .and. at("TAR2P",upper(procname(3)))=0 .and. at("TAR2P",upper(procname(4)))=0
   Alert( "Ocorreu um erro no programa, que será informado automaticamente ao Dr. Inacio. O programa será reiniciado na versão anterior. Você pode prosseguir usando o programa normalmente.")
endif

   // "Quit" selected

   IF ! Empty( oError:osCode )
      cMessage += " " + cDOSError
   ENDIF

*   ? cMessage

*   ?
*   ? "Error at ...:", oError:ProcName + "(" + LTrim( Str( oError:ProcLine ) ) + ") in Module:", oError:ModuleName
*   n := 2
*   WHILE ! Empty( ProcName( ++n ) )
*      ? "Called from :", ProcName( n ) + ;
*      "(" + LTrim( Str( ProcLine( n ) ) ) + ") in Module:", ProcFile( n )
*   ENDDO

/// For some strange reason, the DOS prompt gets written on the first line
/// *of* the message instead of on the first line *after* the message after
/// the program quits, unless the screen has scrolled. - dgh
   LogError( oError )

   ErrorLevel( 1 )
   ?


******* minha função ******

?"Aguarde"
if us#"I"
   mander()
endif

if us#"I" .and. (oError:description)="Corruption detected"
   use
   ferase(oError:filename())
   if file("pega.bat")
      __run("pega ftp.inaciocarvalho.com.br promotor " + snhftp + " www.inaciocarvalho.com.br/copypen/tarefas . " + (oError:filename()))
   else
      __run("recebe ftp.inaciocarvalho.com.br promotor " + snhftp + " www.inaciocarvalho.com.br/copypen/tarefas . " + (oError:filename()))
   endif
   RETURN .T.
ENDIF

/*
if (us="G" .or. us="Y" .or. us="E" .or. us="I") .and. (upper(oError:description)="WRITE ERROR" .or. upper(oError:description)="CREATE ERROR")
if us="I"
?(oError:description)
?upper(oError:description)
?upper(oError:description)="CREATE ERROR"
*wait ""
endif
   use
   RETURN .T.
ENDIF
*/

**********




   QUIT

RETURN .F.

// [vszakats]

STATIC FUNCTION ErrorMessage( oError )

     LOCAL cMessage

     // start error message
     cMessage := Iif( oError:severity > ES_WARNING, "Error", "Warning" ) + " "

     // add subsystem name if available
     If Ischaracter( oError:subsystem )
        cMessage += oError:subsystem()
     Else
        cMessage += "???"
     Endif

     // add subsystem's error code if available
     If Isnumber( oError:subCode )
        cMessage += "/" + Ltrim( Str( oError:subCode ) )
     Else
        cMessage += "/???"
     Endif

     // add error description if available
     If Ischaracter( oError:description )
        cMessage += "  " + oError:description
     Endif

     // add either filename or operation
     Do Case
         Case !Empty( oError:filename )
             cMessage += ": " + oError:filename
         Case !Empty( oError:operation )
             cMessage += ": " + oError:operation
     Endcase

Return cMessage

STATIC FUNCTION LogError( oerr )

     LOCAL cScreen
     LOCAL aLogFile    := SET( _SET_ERRORLOG )
     LOCAL cLogFile    := aLogFile[1]  // error log file name
     LOCAL lAppendLog  := aLogFile[2]  // .f. = create a new error log (default) .t. = append to a existing one.
     LOCAL nStart      := 1
     LOCAL nCellSize
     LOCAL nRange
     LOCAL nCols
     LOCAL nRows

     LOCAL nCount

     LOCAL nForLoop
     LOCAL cOutString
     LOCAL cSubString

     LOCAL nHandle
     LOCAL nBytes

     LOCAL nHandle2   := -1
     LOCAL cLogFile2  := "_error.log"
     LOCAL cBuff      := ""
     LOCAL nRead      := 0


     nCols := MaxCol()
     IF nCols > 0
        nRows := MaxRow()
        cScreen := Savescreen()
     ENDIF
     //Alert( 'An error occured, Information will be ;written to error.log' )

     If !lAppendLog
        nHandle := FCreate( cLogFile, FC_NORMAL )
     Else
        If !File( cLogFile )
           nHandle := FCreate( cLogFile, FC_NORMAL )
        Else
           nHandle  := FCreate( cLogFile2, FC_NORMAL )
           nHandle2 := FOpen( cLogFile, FO_READ )
        Endif
     Endif


     If nHandle < 3 .and. lower( cLogFile ) != 'error.log'
        // Force creating error.log in case supplied log file cannot
        // be created for any reason
        cLogFile := 'error.log'
        nHandle := Fcreate( cLogFile, FC_NORMAL )
     Endif

     If nHandle < 3
     Else

        FWriteLine( nHandle, Padc( ' xHarbour Error Log ' , 79, '-' ) )
        FWriteLine( nHandle, '' )

        FWriteLine( nHandle, 'Date...............: ' + dtoc( date() )  )
        FWriteLine( nHandle, 'Time...............: ' + time()          )

        FWriteLine( nHandle, '' )
        FWriteLine( nHandle, 'Application name...: ' + hb_cmdargargv() )
        FWriteLine( nHandle, 'Workstation name...: ' + netname() )
        FWriteLine( nHandle, 'Available memory...: ' + strvalue( Memory(0) )  )
        FWriteLine( nHandle, 'Current disk.......: ' + diskname() )
        FWriteLine( nHandle, 'Current directory..: ' + curdir() )
        FWriteLine( nHandle, 'Free disk space....: ' + strvalue( DiskSpace() ) )
        FWriteLine( nHandle, '' )
        FWriteLine( nHandle, 'Operating system...: ' + os() )
*        FWriteLine( nHandle, 'xHarbour version...: ' + version() )
*        FWriteLine( nHandle, 'xHarbour built on..: ' + hb_builddate() )
*        FWriteLine( nHandle, 'C/C++ compiler.....: ' + hb_compiler() )

*        FWriteLine( nHandle, 'Multi Threading....: ' + If( Hb_MultiThread(),"YES","NO" ) )
*        FWriteLine( nHandle, 'VM Optimization....: ' + strvalue( Hb_VmMode() ) )

*        IF Type( "Select()" ) == "UI"
*        FWriteLine( nHandle, '' )
*        FWriteLine( nHandle, 'Current Area ......:' + strvalue( &("Select()") ) )
*        ENDIF

*        FWriteLine( nHandle, '' )
*        FWriteLine( nHandle, Padc( ' Environmental Information ', 79, '-' ) )
*        FWriteLine( nHandle, '' )

*        FWriteLine( nHandle, "SET ALTERNATE......: " + strvalue( Set( _SET_ALTERNATE  ), .T. ) )
*        FWriteLine( nHandle, "SET ALTFILE........: " + strvalue( Set( _SET_ALTFILE  )      ) )
*        FWriteLine( nHandle, "SET AUTOPEN........: " + strvalue( Set( _SET_AUTOPEN  ), .T. ) )
*        FWriteLine( nHandle, "SET AUTORDER.......: " + strvalue( Set( _SET_AUTORDER )      ) )
*        FWriteLine( nHandle, "SET AUTOSHARE......: " + strvalue( Set( _SET_AUTOSHARE )      ) )

*        FWriteLine( nHandle, "SET BACKGROUNDTASKS: " + strvalue( Set( _SET_BACKGROUNDTASKS ), .T. ) )
*        FWriteLine( nHandle, "SET BACKGROUNDTICK.: " + strvalue( Set( _SET_BACKGROUNDTICK ), .T. ) )
*        FWriteLine( nHandle, "SET BELL...........: " + strvalue( Set( _SET_BELL  ), .T. ) )
*        FWriteLine( nHandle, "SET BLINK..........: " + strvalue( SetBlink()      ) )

*        FWriteLine( nHandle, "SET CANCEL.........: " + strvalue( Set( _SET_CANCEL  ), .T. ) )
*        FWriteLine( nHandle, "SET CENTURY........: " + strvalue( __SetCentury(), .T. ) )
*        FWriteLine( nHandle, "SET COLOR..........: " + strvalue( Set( _SET_COLOR  )      ) )
*        FWriteLine( nHandle, "SET CONFIRM........: " + strvalue( Set( _SET_CONFIRM  ), .T. ) )
*        FWriteLine( nHandle, "SET CONSOLE........: " + strvalue( Set( _SET_CONSOLE  ), .T. ) )
*        FWriteLine( nHandle, "SET COUNT..........: " + strvalue( Set( _SET_COUNT  )      ) )
*        FWriteLine( nHandle, "SET CURSOR.........: " + strvalue( Set( _SET_CURSOR  )      ) )

*        FWriteLine( nHandle, "SET DATE FORMAT....: " + strvalue( Set( _SET_DATEFORMAT )      ) )
*        FWriteLine( nHandle, "SET DBFLOCKSCHEME..: " + strvalue( Set( _SET_DBFLOCKSCHEME )      ) )
*        FWriteLine( nHandle, "SET DEBUG..........: " + strvalue( Set( _SET_DEBUG ), .T. ) )
*        FWriteLine( nHandle, "SET DECIMALS.......: " + strvalue( Set( _SET_DECIMALS )      ) )
*        FWriteLine( nHandle, "SET DEFAULT........: " + strvalue( Set( _SET_DEFAULT )      ) )
*        FWriteLine( nHandle, "SET DEFEXTENSIONS..: " + strvalue( Set( _SET_DEFEXTENSIONS ), .T. ) )
*        FWriteLine( nHandle, "SET DELETED........: " + strvalue( Set( _SET_DELETED ), .T. ) )
*        FWriteLine( nHandle, "SET DELIMCHARS.....: " + strvalue( Set( _SET_DELIMCHARS )      ) )
*        FWriteLine( nHandle, "SET DELIMETERS.....: " + strvalue( Set( _SET_DELIMITERS ), .T. ) )
*        FWriteLine( nHandle, "SET DEVICE.........: " + strvalue( Set( _SET_DEVICE )      ) )
*        FWriteLine( nHandle, "SET DIRCASE........: " + strvalue( Set( _SET_DIRCASE )      ) )
*        FWriteLine( nHandle, "SET DIRSEPARATOR...: " + strvalue( Set( _SET_DIRSEPARATOR )      ) )

*        FWriteLine( nHandle, "SET EOL............: " + strvalue( Asc( Set( _SET_EOL ) ) )  )
*        FWriteLine( nHandle, "SET EPOCH..........: " + strvalue( Set( _SET_EPOCH )      ) )
*        FWriteLine( nHandle, "SET ERRORLOG.......: " + if(!Empty(aLogFile), strvalue( aLogFile[1] )+","+strvalue( aLogFile[2] ), "") )
*        FWriteLine( nHandle, "SET ERRORLOOP......: " + strvalue( Set( _SET_ERRORLOOP )      ) )
*        FWriteLine( nHandle, "SET ESCAPE.........: " + strvalue( Set( _SET_ESCAPE ), .T. ) )
*        FWriteLine( nHandle, "SET EVENTMASK......: " + strvalue( Set( _SET_EVENTMASK )      ) )
*        FWriteLine( nHandle, "SET EXACT..........: " + strvalue( Set( _SET_EXACT ), .T. ) )
*        FWriteLine( nHandle, "SET EXCLUSIVE......: " + strvalue( Set( _SET_EXCLUSIVE ), .T. ) )
*        FWriteLine( nHandle, "SET EXIT...........: " + strvalue( Set( _SET_EXIT ), .T. ) )
*        FWriteLine( nHandle, "SET EXTRA..........: " + strvalue( Set( _SET_EXTRA ), .T. ) )
*        FWriteLine( nHandle, "SET EXTRAFILE......: " + strvalue( Set( _SET_EXTRAFILE )      ) )

*        FWriteLine( nHandle, "SET FILECASE.......: " + strvalue( Set( _SET_FILECASE )      ) )
*        FWriteLine( nHandle, "SET FIXED..........: " + strvalue( Set( _SET_FIXED ), .T. ) )
*        FWriteLine( nHandle, "SET FORCEOPT.......: " + strvalue( Set( _SET_FORCEOPT ), .T. ) )

*        FWriteLine( nHandle, "SET HARDCOMMIT.....: " + strvalue( Set( _SET_HARDCOMMIT ), .T. ) )

*        FWriteLine( nHandle, "SET IDLEREPEAT.....: " + strvalue( Set( _SET_IDLEREPEAT ), .T. ) )
*        FWriteLine( nHandle, "SET INSERT.........: " + strvalue( Set( _SET_INSERT ), .T. ) )
*        FWriteLine( nHandle, "SET INTENSITY......: " + strvalue( Set( _SET_INTENSITY ), .T. ) )

*        FWriteLine( nHandle, "SET LANGUAGE.......: " + strvalue( Set( _SET_LANGUAGE )      ) )

*        FWriteLine( nHandle, "SET MARGIN.........: " + strvalue( Set( _SET_MARGIN )      ) )
*        FWriteLine( nHandle, "SET MBLOCKSIZE.....: " + strvalue( Set( _SET_MBLOCKSIZE )      ) )
*        FWriteLine( nHandle, "SET MCENTER........: " + strvalue( Set( _SET_MCENTER ), .T. ) )
*        FWriteLine( nHandle, "SET MESSAGE........: " + strvalue( Set( _SET_MESSAGE )      ) )
*        FWriteLine( nHandle, "SET MFILEEXT.......: " + strvalue( Set( _SET_MFILEEXT )      ) )

*        FWriteLine( nHandle, "SET OPTIMIZE.......: " + strvalue( Set( _SET_OPTIMIZE ), .T. ) )
*        FWriteLine( nHandle, "SET OUTPUTSAFETY...: " + strvalue( Set( _SET_OUTPUTSAFETY ), .T. ) )

*        FWriteLine( nHandle, "SET PATH...........: " + strvalue( Set( _SET_PATH )      ) )
*        FWriteLine( nHandle, "SET PRINTER........: " + strvalue( Set( _SET_PRINTER ), .T. ) )
*        FWriteLine( nHandle, "SET PRINTERJOB.....: " + strvalue( Set( _SET_PRINTERJOB )      ) )
*        FWriteLine( nHandle, "SET PRINTFILE......: " + strvalue( Set( _SET_PRINTFILE )      ) )

*        FWriteLine( nHandle, "SET SCOREBOARD.....: " + strvalue( Set( _SET_SCOREBOARD ), .T. ) )
*        FWriteLine( nHandle, "SET SCROLLBREAK....: " + strvalue( Set( _SET_SCROLLBREAK ), .T. ) )
*        FWriteLine( nHandle, "SET SOFTSEEK.......: " + strvalue( Set( _SET_SOFTSEEK ), .T. ) )
*        FWriteLine( nHandle, "SET STRICTREAD.....: " + strvalue( Set( _SET_STRICTREAD ), .T. ) )

*        FWriteLine( nHandle, "SET TRACE..........: " + strvalue( Set( _SET_TRACE ), .T. ) )
*        FWriteLine( nHandle, "SET TRACEFILE......: " + strvalue( Set( _SET_TRACEFILE )      ) )
*        FWriteLine( nHandle, "SET TRACESTACK.....: " + strvalue( Set( _SET_TRACESTACK )      ) )
*        FWriteLine( nHandle, "SET TRIMFILENAME...: " + strvalue( Set( _SET_TRIMFILENAME )      ) )

*        FWriteLine( nHandle, "SET TYPEAHEAD......: " + strvalue( Set( _SET_TYPEAHEAD )      ) )

*        FWriteLine( nHandle, "SET UNIQUE.........: " + strvalue( Set( _SET_UNIQUE ), .T. ) )

*        FWriteLine( nHandle, "SET VIDEOMODE......: " + strvalue( Set( _SET_VIDEOMODE )      ) )

*        FWriteLine( nHandle, "SET WRAP...........: " + strvalue( Set( _SET_WRAP ), .T. ) )


        FWriteLine( nHandle, "" )

        IF nCols > 0
            FWriteLine( nHandle, Padc( 'Detailed Work Area Items', nCols, '-' ) )
        ELSE
            FWriteLine( nHandle, 'Detailed Work Area Items ' )
        ENDIF
        FWriteLine( nHandle, "" )

        IF Type( "Select()" ) == "UI"
           For nCount := 1 To 600
              If !Empty( ( nCount )->( &("Alias()") ) )
                 ( nCount )->( FWriteLine( nHandle, "Work Area No ......: " + strvalue( &("Select()") ) ) )
                 ( nCount )->( FWriteLine( nHandle, "Alias .............: " + &("Alias()") ) )
                 ( nCount )->( FWriteLine( nHandle, "Current Recno .....: " + strvalue( &("RecNo()") ) ) )
                 ( nCount )->( FWriteLine( nHandle, "Current Filter ....: " + &("DbFilter()") ) )
                 ( nCount )->( FWriteLine( nHandle, "Relation Exp. .....: " + &("DbRelation()") ) )
                 ( nCount )->( FWriteLine( nHandle, "Index Order .......: " + strvalue( &("IndexOrd(0)") ) ) )
                 ( nCount )->( FWriteLine( nHandle, "Active Key ........: " + strvalue( &("IndexKey(0)") ) ) )
                 ( nCount )->( FWriteLine( nHandle, "" ) )
              Endif
           Next
        ENDIF

        FWriteLine( nHandle, "" )
        IF nCols > 0
            FWriteLine( nHandle, Padc( " Internal Error Handling Information  ", nCols, "-" ) )
        ELSE
            FWriteLine( nHandle, " Internal Error Handling Information  " )
        ENDIF
        FWriteLine( nHandle, "" )
        FWriteLine( nHandle, "Subsystem Call ....: " + oErr:subsystem() )
        FWriteLine( nHandle, "System Code .......: " + strvalue( oErr:suBcode() ) )
        FWriteLine( nHandle, "Default Status ....: " + strvalue( oerr:candefault() ) )
        FWriteLine( nHandle, "Description .......: " + oErr:description() )
        FWriteLine( nHandle, "Operation .........: " + oErr:operation() )
        FWriteLine( nHandle, "Arguments .........: " + Arguments( oErr ) )
        FWriteLine( nHandle, "Involved File .....: " + oErr:filename() )
        FWriteLine( nHandle, "Dos Error Code ....: " + strvalue( oErr:oscode() ) )

        #ifdef HB_THREAD_SUPPORT
        FWriteLine( nHandle, "Running threads ...: " + strvalue( oErr:RunningThreads() ) )
        FWriteLine( nHandle, "VM thread ID ......: " + strvalue( oErr:VmThreadId() ) )
        FWriteLine( nHandle, "OS thread ID ......: " + strvalue( oErr:OsThreadId() ) )
        #endif

        FWriteLine( nHandle, "" )
        FWriteLine( nHandle, " Trace Through:" )
        FWriteLine( nHandle, "----------------" )

fWriteLine ( nHandle, "Base em uso: "+alias() )
fWriteLine ( nHandle, "Pasta: "+curdir() )
*if type("us")#"U"
   fWriteLine ( nHandle, "US:"+us )
*endif
fWriteLine ( nHandle, "Versão: "+vers )
        FWriteLine( nHandle, Padr( oErr:ProcName, 21 ) + " : " + Transform( oErr:ProcLine, "999,999" ) + " in Module: " + oErr:ModuleName )
        nCount := 3
        While !Empty( Procname( ++ nCount ) )
          FWriteLine( nHandle, Padr( Procname( nCount ), 21 ) + ' : ' + Transform( Procline( nCount ), "999,999" ) + " in Module: " + ProcFile( nCount ) )
        Enddo

        FWriteLine( nHandle, "" )
        FWriteLine( nHandle, "" )

        IF valtype( cScreen ) == "C"
            FWriteLine( nHandle, Padc( " Video Screen Dump ", nCols, "#" ) )
            FWriteLine( nHandle, "" )
            //FWriteLine( nHandle, "" )
            FWriteLine( nHandle, "+" + Replicate( '-', nCols + 1 ) + "+" )
            //FWriteLine( nHandle, "" )
            nCellSize := len( Savescreen( 0, 0, 0, 0 ) )
            nRange := ( nCols + 1 ) * nCellSize
            For nCount := 1 To nRows + 1
               cOutString := ''
               cSubString := Substr( cScreen, nStart, nRange )
               For nForLoop := 1 To nRange step nCellSize
                  cOutString += Substr( cSubString, nForLoop, 1 )
               Next
               FWriteLine( nHandle, "|" + cOutString + "|" )
               nStart += nRange
            Next
            FWriteLine( nHandle, "+" + Replicate( '-', nCols + 1 ) + "+" )
            FWriteLine( nHandle, "" )
            FWriteLine( nHandle, "" )
        ELSE
            FWriteLine( nHandle, " Video Screen Dump not available" )
        ENDIF


    /*
     *  FWriteLine( nHandle, padc(" Available Memory Variables ",nCols,'+') )
     *  FWriteLine( nHandle, "" )
     *  Save All Like * To errormem
     *  nMemHandle := Fopen( 'errormem.mem', FO_READWRITE )
     *  nMemLength := Fseek( nMemHandle, 0, 2 )
     *  Fseek( nMemHandle, 0 )
     *  nCount := 1
     *  While Fseek( nMemHandle, 0, 1 ) + 1 < nMemLength
     *    nMemWidth := Space( 18 )
     *    Fread( nMemHandle, @nMemWidth, 18 )
     *    cVarName  := Left( nMemWidth, At( Chr( 0 ), nMemWidth ) - 1 )
     *    cVarType  := Substr( nMemWidth, 12, 1 )
     *    cVarRec   := Bin2w( Right( nMemWidth, 2 ) )
     *    nMemCount := If( cVarType IN Chr( 195 ) + Chr( 204 ), 14 + cVarRec, 22 )
     *    Fseek( nMemHandle, nMemCount, 1 )
     *    cTemp  := Left( cVarName + Space( 10 ), 10 )
     *    cTemp  += " TYPE " + Type( cVarName )
     *    cTemp  += " " + If( Type( cVarName ) == "C", '"' + &cVarName + '"', strvalue( &cVarName ) )
     *    nBytes := 0
     *    Switch ValType( cVarName )
     *        Case "C"
     *            nBytes += ( nLenTemp := Len( &cVarName ) )
     *            exit
     *        Case "N"
     *            nBytes += ( nLenTemp := 9 )
     *            exit
     *        Case 'L'
     *            nBytes += ( nLenTemp := 2 )
     *            exit
     *        Case "D"
     *            nBytes += ( nLenTemp := 9 )
     *            exit
     *    End
     *    Fwrite( nFhandle, "            " + Transform( nLenTemp, '999999' ) + 'bytes -> ' )
     *    FWriteLine( nHandle, "      " + cTemp )
     *  Enddo
     *  Fclose( nMemHandle )
     *  Ferase( 'errormem.mem' )
     */
        if lAppendLog .and. nHandle2 != -1

           nBytes := FSeek( nHandle2, 0, FS_END )

           cBuff := space(10)
           FSeek( nHandle2, 0, FS_SET )

           while nBytes > 0
             nRead := FRead( nHandle2, @cBuff, 10 )
             FWrite( nHandle, cBuff, nRead )
             nBytes -= nRead
             cBuff := space( 10 )
           enddo

           FClose( nHandle2 )
           FClose( nHandle )

           FErase( cLogFile )
           FRename( cLogFile2, cLogFile )
        else
           FClose( nHandle )
        endif

     Endif

Return .f.

STATIC FUNCTION strvalue( c, l )

     LOCAL cr := ''
     Default l To .f.
     Switch ValType( c )
         Case "C"
             cr := c
             exit
         Case "N"
             cr := Alltrim( Str( c ) )
             exit
         Case "M"
             cr := c
             exit
         Case "D"
             cr := Dtoc( c )
             exit
         Case "L"
//             cr := If( l, If( c, "On", "Off" ), If( c, "True", "False" ) )
             cr := If( l, If( c, "On", "Off" ), If( c, ".t.", ".f." ) )
             exit
     End
Return Upper( cr )

STATIC FUNCTION FWriteLine( nh, c )

   Fwrite( nh, c + HB_OsNewLine() )
   //HB_OutDebug( c + HB_OsNewLine() )
Return nil


STATIC FUNCTION Arguments( oErr )

   LOCAL xArg, cArguments := ""

   IF ValType( oErr:Args ) == "A"
      FOR EACH xArg IN oErr:Args
         cArguments += " [" + Str( HB_EnumIndex(), 2 ) + "] = Type: " + ValType( xArg )

         IF xArg != NIL
            cArguments +=  " Val: " + CStr( xArg )
         ENDIF
      NEXT
   ENDIF

RETURN cArguments

#ifdef __PLATFORM__Windows
#pragma BEGINDUMP

#include "hbapi.h"
#include "hbapiitm.h"
#include "hbvm.h"
#include "hbvmpub.h"
#include "hbfast.h"
#include "hbstack.h"
#include "thread.h"

#include <windows.h>

static PHB_SYMB s_xHbFunc = NULL;

LONG WINAPI PRGUnhandledExceptionFilter( EXCEPTION_POINTERS *ExceptionInfo )
{
   if( s_xHbFunc )
   {
      HB_ITEM Exception;
      PHB_DYNS pDyn = hb_dynsymFind( "HB_CSTRUCTURE" );

      Exception.type = HB_IT_NIL;

      //TraceLog( NULL, "%s(%p)\n", pExecSym->pSymbol->szName, ExceptionInfo );

      if( pDyn )
      {
         hb_vmPushSymbol( pDyn->pSymbol );
         hb_vmPushNil();
         hb_itemPushStaticString( "EXCEPTION_POINTERS", 18 );
         hb_vmPushLong( 8 );
         hb_vmDo( 2 );

         if( hb_stackReturnItem()->type == HB_IT_OBJECT )
         {
            HB_ITEM_NEW( Buffer );
            HB_ITEM Adopt;

            hb_itemForwardValue( &Exception, hb_stackReturnItem() );

            hb_itemPutCLStatic( &Buffer, (char *) ExceptionInfo, sizeof( EXCEPTION_POINTERS ) );

            Adopt.type = HB_IT_LOGICAL;
            Adopt.item.asLogical.value = FALSE;

            hb_objSendMsg( &Exception, "Buffer", 2, &Buffer, &Adopt );
         }
      }

      hb_vmPushSymbol( s_xHbFunc );
      hb_vmPushNil();
      hb_itemPushForward( &Exception );
      hb_vmDo( 1 );

      //TraceLog( NULL, "Done\n" );
   }

   return hb_itemGetNL( hb_stackReturnItem() );
}

HB_FUNC( SETERRORMODE )
{
   hb_retni( SetErrorMode( hb_parni( 1 ) ) ) ;
}

HB_FUNC( SETUNHANDLEDEXCEPTIONFILTER )
{
   LPTOP_LEVEL_EXCEPTION_FILTER pDefaultHandler;

   s_xHbFunc = (PHB_SYMB) hb_parptr( 1 );

   pDefaultHandler = SetUnhandledExceptionFilter( PRGUnhandledExceptionFilter );
   //TraceLog( NULL, "Default: %p\n", pDefaultHandler );

   hb_retnl( (LONG) pDefaultHandler );
}

#pragma ENDDUMP

#endif
*+ EOF: ERRORSYS.PRG
Não sei o motivo deste erro. Me ajude por favor.

Executar programa sem janela (invisível)

Enviado: 02 Out 2012 06:15
por Jairo Maia
Olá Inácio,
cjp escreveu:1 - O que eu não estou entendendo é como vou imprimir vários campos de base (quaisquer que sejam) por esse método.
2 - Tem como escolher outra impressora instalada?
Adapte o exemplo abaixo a seu sistema:

Código: Selecionar todos

Function Main
 
 cCampos   := "DTOC(data) + Space(2) + hora + Space(2) + tarefa"
 cCriterio := "Recno() > 10 .And. Recno() < 20"

 Select Seu_Dbf
 Set Index To Numero_Do_Indice

 // Seek &cCriterio
 // ou
 // Go Registro

 Go 11  // apenas para esse exemplo

 // If !Found()
   // Hb_Alert( "Criterio nÆo encontrado" )
   // Return Nil
 // EndIf

 PrintDados( cCampos, cCriterio )

Return Nil

Function PrintDados( cCampos, cCriterio )
 Local i, nPrn, oPrn, nMaxLen := 0, aPNomes := {}
 Local aPrn := Win_PrinterList( .t., .f. )

 If Empty( aPrn )
  Hb_Alert( "Nenhuma impressora Instalada" )
  Return Nil
 Endif

 For i=1 To Len( aPrn )
  AaDd( aPNomes , aPrn[i,1] )
  nMaxLen := If( Len( aPrn[i,1] ) > nMaxLen, Len( aPrn[i,1] ), nMaxLen )
 Next

 Clear Screen

 nPrn := AChoice( 3, 1, Len( aPrn )+1, nMaxLen+1, aPNomes, .T., Nil , aPNomes )
 If nPrn = 0
  Return Nil
 Endi

 oPrn := Win_Prn():new( aPNomes[nPrn] )

 If !oPrn :Create()
  Hb_alert("Nao foi criado o documento de Impressao")
  Return nil
 ElseIf !oPrn :StartDoc("Imprimindo Documento")
  Hb_alert("Erro na Impressora")
  Return nil
 EndIf

 While &cCriterio. .And. !Eof()

  oPrn :NewLine()
  oPrn :TextOut( Hb_AnsiToOem( &cCampos. ) )

  nPrn := oPrn :BottomMargin()
  If nPrn = pRow() + 2
   oPrn :NewPage()
  Endi

  Skip

 Endd

 oPrn :EndDoc()
 oPrn :Destroy()

Return Nil
Jairo Maia escreveu:Além disso: como farei pra imprimir um relatório grande desta forma, inclusive "desenhando" a impressão com quadros, por exemplo?
O exemplo para impressão foi dado. Agora é analisar o código e montar o layout da forma que você desejar.
cjp escreveu:Um outro problema que estou enfrentando no Harbour: o errorsys.prg que eu havia modificado
Este erro ocorre porquê o controlador de erros foi chamado 10 vezes consecutivas. Compile o sistema sem o errorsys personalizado para saber qual é o erro e faça a correção. Pessoalmente, eu não analiso ERRORSYS.
cjp escreveu:O problema é que, assim, eu não tenho como saber quando ele acaba de executar. Será que tem um jeito?
Uma sugestão seria verificar se ele está em atividade quando tentar acioná-lo. Para isso, você pode fazer assim:

Código: Selecionar todos

nHandler := FOpen( "TAR2P.EXE", 2 )
If FError() != 0
 Hb_Alert( "TAR2P executando tarefa" )
Else
 FClose( nHandler )
 Hb_Run( "Start /b TAR2P.EXE" )
Endi
Ou Assim, se a iéia for verificar se ele está disponível:

Atribua uma função a uma tecla, no inicio do seu PRG principal:

Código: Selecionar todos

SetKey( K_F3, { || VerificaTar2p() } )
E colocar a função no seu programa:

Código: Selecionar todos

Function VerificaTar2p()
 Local nHandler := FOpen( "TAR2P.EXE", 2 )
 If FError() != 0
  Hb_Alert( "TAR2P executando tarefa" )
 Else
  Hb_Alert( "TAR2P liberado para ser executado" )
 Endi
 FClose( nHandler )
Return Nil

Executar programa sem janela (invisível)

Enviado: 07 Out 2012 00:49
por cjp
Vou estudar a questão da impressão.

A verificação de se o programa está rodando eu já fiz, acho que deu certo, só falta fazer alguns testes. Mas, de qualquer forma, muito obrigado por tudo.

Mas ainda estou precisando da tua ajuda quanto à questão do errorsys: de fato eu tirei o meu errorsys e achei o erro. Até aí ok. O problema é que eu preciso do meu errorsys. Quando rodo com o xbuild do xharbour, não dá essa chamada recursiva. Mas quando rodo com o harbour, sempre que tem algum erro no programa, dá essa chamada recursiva, daí ele não executa o meu errorsys.

Por que acontece isso? Como posso fazer para tratar o errorsys sem dar essa chamada recursiva?

Executar programa sem janela (invisível)

Enviado: 10 Out 2012 18:14
por cjp
Caro Jairo,

Estou testando a questão da impressão e já consegui fazer algumas coisas interessantes.

Entretanto, estou encontrando muita dificuldade para fazer relatórios mais consistentes, especialmente no tocante aos caracteres diferenciados. Exemplo: como faço para imprimir em negrito, ou sublinhado, ou com tamanho de fonte maior? Como faço para imprimir linhas verticais, de forma a fechar um quadrado, por exemplo?

Além disso, se eu quiser imprimir um campo em determinada posição do papel, existe um jeito? Será que a função oPrn :TextOut() permite especificar coluna e linha da impressão?

Outra questão: a função nPrn := oPrn :BottomMargin() não funcionou. Ele não está pulando a página quando chega ao final. Fiz alguns testes. Consegui fazer isso manualmente (imprimo tantas linhas e daí dou um oPrn :NewPage()), mas seria bom se ele fizesse isso automaticamente, pois em alguns relatórios eu não sei de antemão quantas linhas tem os campos.

Outra: na linha "DTOC(data) + Space(2) + hora + Space(2) + tarefa", tem como colocar texto intercalando os campos da base? Como a linha inteira já está entre aspas, não funcionou. Existem algum jeito de escrever, por exemplo: "Em "+DTOC(data) + ", às " + hora + "fazer: "+ tarefa?

Obrigado

Executar programa sem janela (invisível)

Enviado: 11 Out 2012 10:35
por Jairo Maia
Olá Inácio,

Não tenho muita experiência de impressão. Aliás, impressão é objeto de estudo atual de minha parte. Sei fazer o básico, não sei ainda explorar os recursos do Harbour que são imensos.
cjp escreveu:Será que a função oPrn :TextOut() permite especificar coluna e linha da impressão?
Não! Mas a função DispOutAt() sim, inclusive a cor, já os tamanho e tipo da fonte deve ser configurada antes.

Código: Selecionar todos

DispOutAt( nLinha, nColuna, cExpressao, cCor, lSetPos )
O parâmetro lSetPos se definido como .T., posiciona na próxima linha após a impressão dispensando o uso de o:NewLine().
cjp escreveu:nPrn := oPrn :BottomMargin() não funcionou
Não mesmo. Mesmo configurando o tamanho da página não funcionou. Não entendi.

Dê uma olhada neste tópico do colega Roanldo: MR_Print: Sistema de Impressão para Harbour

Sugiro que você abra um novo tópico a respeito de impressão, acho que ficaria melhor se ficar desvinculado desse.

Executar programa sem janela (invisível)

Enviado: 18 Out 2012 23:46
por cjp
Meu caro,

Estou tentando entender o mrprint, mas está difícil!!!

A dispout está dando o seguinte erro:

Código: Selecionar todos

Ocorreu o erro: Error BASE/1004  Message not found: WIN_PRN:DISPOUTAT
Data: 18/10/12; hora: 23:35:10
Programa......: C:\Agenda\agenda.exe
Na função.....: __ERRRT_SBASE
Na linha......: 0
Base em uso...: LTCOMP
Pasta.........: agenda
Usuário.......: I
Versão........: 31/03/12

Caminho Percorrido Antes do Erro:

Vindo de......: __ERRRT_SBASE Linha: (0)
Vindo de......: WIN_PRN:ERROR Linha: (0)
Vindo de......: (b)HBOBJECT Linha: (0)
Vindo de......: WIN_PRN:MSGNOTFOUND Linha: (0)
Vindo de......: WIN_PRN:DISPOUTAT Linha: (0)
Vindo de......: PRINTDADOS Linha: (160)
Vindo de......: COMIDA Linha: (3584)
Vindo de......: CONTAGEN Linha: (1717)
Vindo de......: MAIN Linha: (314)
A linha está assim:

Código: Selecionar todos

 oPrn :DispOutAt(1,1,"Produto a comprar:                                   Preço máximo:",,.t.)
Por favor, me ajude. Era tão simples imprimir no xharbour com o set print. Não é possível que não exista uma forma mais simples de imprimir no harbour.

Executar programa sem janela (invisível)

Enviado: 19 Out 2012 08:20
por Jairo Maia
Olá Inácio,

Pois é. Fica muito mais difícil ainda quando as dicas são equivocadas. Errei feio. DispOutAt() é uma função e nada tem a ver com impressão. É saída para video. O correto seria ser: oPrn: TextOutAt( nPosX, nPosY, cString, lNewLine, lUpdatePosX, TextAlign ), conforme manual de referência do xHarbour, e a posição deve ser informada em Pixels.

Inácio, poste sua rotina que você usava no xHarbour. Acho que fica mais fácil ajudar vendo sua rotina antiga.

Executar programa sem janela (invisível)

Enviado: 19 Out 2012 21:39
por Pablo César
Inácio, você não poderia abrir novos tópicos caso não ache no sistema de "Busca Avançada" do fórum para cada tipo de questões ? Este tópico há perdido o sentido. Cada vez surgem dúvidas e você está colocando tudo no mesmo. Por isso vou trancar o tópico, já que pelo jeito você já resolveu o seu problema com a não exibição de janela da sua aplicação.