Executar programa sem janela (invisível)
Moderador: Moderadores
Executar programa sem janela (invisível)
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?
Ainda falta resolver a questão da impressora. Vc saberia me dizer como fazer pra imprimir?
Inacio de Carvalho Neto
- Jairo Maia
- Moderador
- Mensagens: 2785
- Registrado em: 16 Ago 2010 13:46
- Localização: Campinas-SP
Executar programa sem janela (invisível)
Olá Inácio,
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.
Legal. Mais um problema resolvido.cjp escreveu:Deu certo, meu caro, muito obrigado. Que maravilha!!! Muito obrigado mesmo.
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.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Executar programa sem janela (invisível)
Estou fazendo assim pra imprimir, meu caro:
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?
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
Inacio de Carvalho Neto
- Jairo Maia
- Moderador
- Mensagens: 2785
- Registrado em: 16 Ago 2010 13:46
- Localização: Campinas-SP
Executar programa sem janela (invisível)
Olá Inácio,
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:
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.cjp escreveu:a tela do programa principal perde a sua configuração original de cores
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 NilAbraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Executar programa sem janela (invisível)
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:

E agora a tela do programa quando executo o tar2p:

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:

Mais uma vez obrigado por sua ajuda.
Inacio
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:

E agora a tela do programa quando executo o tar2p:

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:

Mais uma vez obrigado por sua ajuda.
Inacio
Inacio de Carvalho Neto
- Jairo Maia
- Moderador
- Mensagens: 2785
- Registrado em: 16 Ago 2010 13:46
- Localização: Campinas-SP
Executar programa sem janela (invisível)
Olá Inácio,
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.
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:E agora a tela do programa quando executo 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.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
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.
Aqui foi um erro meu. Onde escrevi: AnsiToOem( cDados ), corrija para: Hb_AnsiToOem( cDados )cjp escreveu:está dando um erro na compilação referente à função AnsiToOem( cDados )
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?cjp escreveu:Se eu quero passar vários campos da base pra ela imprimir, como faço?
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Executar programa sem janela (invisível)
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.
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.
Inacio de Carvalho Neto
Executar programa sem janela (invisível)
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:
O errorsys que eu modifiquei (em poucos pontos) tá assim:
Não sei o motivo deste erro. Me ajude por favor.
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
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
Inacio de Carvalho Neto
- Jairo Maia
- Moderador
- Mensagens: 2785
- Registrado em: 16 Ago 2010 13:46
- Localização: Campinas-SP
Executar programa sem janela (invisível)
Olá Inácio,
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:
E colocar a função no seu programa:
Adapte o exemplo abaixo a seu sistema: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?
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 NilO exemplo para impressão foi dado. Agora é analisar o código e montar o layout da forma que você desejar.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?
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:Um outro problema que estou enfrentando no Harbour: o errorsys.prg que eu havia modificado
Uma sugestão seria verificar se ele está em atividade quando tentar acioná-lo. Para isso, você pode fazer assim:cjp escreveu:O problema é que, assim, eu não tenho como saber quando ele acaba de executar. Será que tem um jeito?
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" )
EndiAtribua uma função a uma tecla, no inicio do seu PRG principal:
Código: Selecionar todos
SetKey( K_F3, { || VerificaTar2p() } )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 NilAbraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Executar programa sem janela (invisível)
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?
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?
Inacio de Carvalho Neto
Executar programa sem janela (invisível)
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
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
Inacio de Carvalho Neto
- Jairo Maia
- Moderador
- Mensagens: 2785
- Registrado em: 16 Ago 2010 13:46
- Localização: Campinas-SP
Executar programa sem janela (invisível)
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.
O parâmetro lSetPos se definido como .T., posiciona na próxima linha após a impressão dispensando o uso de o:NewLine().
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.
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.
Não! Mas a função DispOutAt() sim, inclusive a cor, já os tamanho e tipo da fonte deve ser configurada antes.cjp escreveu:Será que a função oPrn :TextOut() permite especificar coluna e linha da impressão?
Código: Selecionar todos
DispOutAt( nLinha, nColuna, cExpressao, cCor, lSetPos )Não mesmo. Mesmo configurando o tamanho da página não funcionou. Não entendi.cjp escreveu:nPrn := oPrn :BottomMargin() não funcionou
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.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Executar programa sem janela (invisível)
Meu caro,
Estou tentando entender o mrprint, mas está difícil!!!
A dispout está dando o seguinte erro:
A linha está assim:
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.
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)
Código: Selecionar todos
oPrn :DispOutAt(1,1,"Produto a comprar: Preço máximo:",,.t.)
Inacio de Carvalho Neto
- Jairo Maia
- Moderador
- Mensagens: 2785
- Registrado em: 16 Ago 2010 13:46
- Localização: Campinas-SP
Executar programa sem janela (invisível)
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.
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.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Executar programa sem janela (invisível)
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.
Um clip-abraço !
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
