Me utilizo de um software que desenvolvemos em Delphi, que lê o arquivo txt de relatórios que geramos em nossa aplicação harbour (meio console/meio gui) e apresenta de forma gráfica, dando preview e podendo ser impresso em qualquer impressora instalada no windows... dai executamos ele internamente em nosso sistema e parece que a aplicação faz parte do nosso sistema, mas na verdade, esta sendo executada através do shellexecute... até ai tudo bem...
Como agora estamos passando tudo para gui, queremos eliminar o nosso "impwin" e trazer essa função de converter os arquivos txt em relatórios, dentro do próprio sistema, evitando assim de ter que executar aplicações externas, que de vez em quando, da uma travadinha, dependendo do terminal é mais lento, etc...
Pensando nisso, começamos a desenvolver o nosso "conversor interno", se utilizando da miniprint, também sem problemas, pois é bem simples o processo, mas nos deparamos com um problema, como ainda estamos lendo um arquivo texto, temos que utilizar fontes mono-espaçadas (courier new) na geração do relatório na miniprint, para definirmos o quanto de caracter cabe em uma linha, seja retrato ou paisagem, fazemos a seguinte conta:
Em A4 retrato, temos 210mm de largura, portanto 21 cm que divido por 2,54 cm (que é uma polegada), temos 8,2677 caracter por polegada, se formos imprimir 20 cpp (caracter por polegada), teríamos 165 colunas a serem impressas na linha, de uma ponta a outra, dai vamos lá e testamos qual tamanho da fonte, chega nesse número de caracteres.
Mas o que esta acontecendo é que quando mando imprimir acima de 144 caracteres, simplesmente não imprime... ja alterei tudo que é configuração e nada... não consigo imprimir acima de 144 caracteres por linha... se diminuir a fonte, deveria ser mais por polegada, mas não gera nem na tela... o que poderia estar fazendo de errado... ou é uma limitação mesmo ? se for, é muito estranho, pois em nosso "impwin", gera normal...
Segue o fonte, de como estou lendo o spool e gerando na tela o relatório utilizando a miniprint
Código: Selecionar todos
// Gerar impressão a partir do SPOOL???.TXT
#include "fileio.ch"
#include 'minigui.ch'
#include 'miniprint.ch'
#include 'cores.ch'
//----------------
FUNCTION GeraImp()
//----------------
LOCAL nHandle, nPointer := 0, xlinimp := 10
LOCAL xconteudo, xcabec, xfim := .F., xfonte := 0
LOCAL xForm, xLinCfg, xLM, xCO, xMP, xPV
LOCAL xBold, xTamEX, xTamNM, xTam12, xTam17,xTam20, xNvPg
PRIVATE xTamLer := 80
nHandle := FOPEN( xspool, FO_READ )
IF FERROR() <> 0
MsgMenu('Não foi possível abrir: '+xspool,{'&OK'},,"IM__ERRO",'Atenção...',,,'32 ERR CAN',,,_branco_)
RETURN(NIL)
END
// Le as informações iniciais
// Primeira linha, contem o que esta sendo impresso, se estiver em branco é relatório
xForm := LeSpool(nHandle,@nPointer,@xfim)
IF xfim
MsgMenu('Relatório sem conteúdo !!!',{'&OK'},,"IM__ERRO",'Atenção...',,,'32 ERR CAN',,,_branco_)
RETURN(NIL)
END
// Segunda linha, contem as configurações -> @lm@nnn / @co@nnn / @mp@nn / @pv@
xLinCfg := LeSpool(nHandle,@nPointer,@xfim)
xLM := RetContLinha('@lm@',@xLinCfg,3)
xCO := RetContLinha('@co@',@xLinCfg,3)
xMP := RetContLinha('@mp@',@xLinCfg,2)
xPV := RetContLinha('@pv@',@xLinCfg,0)
xTamLer := VAL(xCO)+20
SELECT PRINTER DIALOG // Pede a impressora
// PRINTER_PAPER_A4 // IIF(VAL(xCO)>156,PRINTER_ORIENT_LANDSCAPE,PRINTER_ORIENT_PORTRAIT)
// PAPERSIZE PRINTER_PAPER_USER // QUALITY PRINTER_RES_DRAFT PRINTER_ORIENT_LANDSCAPE
SELECT PRINTER DEFAULT PAPERSIZE PRINTER_PAPER_A4 PREVIEW // Configura
START PRINTDOC NAME 'Gerenciador de Impressão'
START PRINTPAGE
ImpLogo(xForm)
WHILE !xfim
xconteudo := LeSpool(nHandle,@nPointer,@xfim)
// Retira configuracoes iniciais do cabecario
xcabec := RetContLinha('@lm@',@xconteudo,3)
IF EMPTY(xcabec)
// Negrito
xBold := IIF(EMPTY(RetContLinha('@ng@',@xconteudo,0)),.F.,.T.)
// Tamanho da Fonte
xTamEX := IIF(EMPTY(RetContLinha('@ex@',@xconteudo,0)),0,13)
xTamNM := IIF(EMPTY(RetContLinha('@nm@',@xconteudo,0)),0,11)
xTam12 := IIF(EMPTY(RetContLinha('@12@',@xconteudo,0)),0,9)
xTam17 := IIF(EMPTY(RetContLinha('@17@',@xconteudo,0)),0,7)
xTam20 := IIF(EMPTY(RetContLinha('@20@',@xconteudo,0)),0,5)
xfonte := IIF(xTamEX > 0, xTamEX, IIF(xTamNM > 0, xTamNM, IIF(xTam12 > 0, xTam12, IIF(xTam17 > 0, xTam17, IIF(xTam20 > 0, xTam20, xfonte ) ) ) ) )
// Nova Pagina
xNvPg := IIF(EMPTY(RetContLinha('@np@',@xconteudo,0)),.F.,.T.)
IF "-----" $ xconteudo
@ xlinimp,8 PRINT LINE TO xlinimp,LEN(xconteudo) PENWIDTH 0.5 COLOR _preto_
ELSE
IF xBold
@ xlinimp,8 PRINT xconteudo FONT 'Courier New' SIZE xfonte BOLD
ELSE
@ xlinimp,8 PRINT xconteudo FONT 'Courier New' SIZE xfonte
END
END
xlinimp += 3
IF xNvPg
END PRINTPAGE
START PRINTPAGE
ImpLogo(xForm)
xlinimp := 10
END
DO EVENTS
END
END
FCLOSE(nHandle)
END PRINTPAGE
END PRINTDOC
RETURN(NIL)
//---------------------------------------
STATIC FUNCTION LeSpool(zHan,zPoint,zfim)
//---------------------------------------
LOCAL cBuffer, nLido, nEol, cLinha := ''
LOCAL cEol := CHR(13)+CHR(10)
zfim := .F.
cBuffer := SPACE(xTamLer)
FSEEK( zHan, zPoint, 0 )
nLido := FREAD( zHan, @cBuffer, xTamLer )
nEol := AT( cEol, cBuffer )
IF nEol <= 0 // fim de arquivo
zfim := .T.
ELSE
cLinha := LEFT( cBuffer, nEol - 1 )
zPoint += nEol + 1
END
RETURN(cLinha)
//--------------------------------------------------
STATIC FUNCTION RetContLinha(zconteudo,zlinha,zqtde)
//--------------------------------------------------
LOCAL nBusca, zret := '', nCnt, zlinha2 := ''
FOR nCnt = 1 TO LEN(zlinha)
IF SUBSTR(zlinha,nCnt,LEN(zconteudo)) = zconteudo
IF zqtde > 0
zret := SUBSTR(zlinha,nCnt+LEN(zconteudo),zqtde)
ELSE
zret := SUBSTR(zlinha,nCnt,LEN(zconteudo))
END
zlinha2 += SUBSTR(zlinha,nCnt+LEN(zconteudo)+zqtde,LEN(zlinha)-LEN(zlinha2)-LEN(zconteudo)-zqtde)
EXIT
ELSE
zlinha2 += SUBSTR(zlinha,nCnt,1)
END
NEXT
zlinha := zlinha2
RETURN(zret)
//----------------------------
STATIC FUNCTION ImpLogo(zForm)
//----------------------------
IF EMPTY(zForm)
@ 01,05 PRINT IMAGE IIF(zzDEMOzz,"IM__DEMONSTRACAO",IM__LOGOEMP) WIDTH 32 HEIGHT 32 STRETCH
END
RETURN(NIL)