Miniprint

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

Avatar do usuário
FFreire
Usuário Nível 3
Usuário Nível 3
Mensagens: 113
Registrado em: 19 Mai 2013 16:16
Localização: Andirá-PR / Itaporanga-SP

Miniprint

Mensagem por FFreire »

Prezados...

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)
F.Freire
Harbour 3.2.0+MiniGui Extended 16.02+BCC5 / HWGdebug / SIXCDX / PostgreSQL 9.5 / LetoDB 2.15 / Java8
fabiano@ffsoft.com.br
Avatar do usuário
FFreire
Usuário Nível 3
Usuário Nível 3
Mensagens: 113
Registrado em: 19 Mai 2013 16:16
Localização: Andirá-PR / Itaporanga-SP

Miniprint

Mensagem por FFreire »

Segue algumas telas... de como fica o resultado final...
Sem título.png
Sem título1.png
São relatórios com tamanho menor que 144, se tiver mais de 144 caracteres, não gera o bendito... isso ai acima ja é com a miniprint !
Harbour 3.2.0+MiniGui Extended 16.02+BCC5 / HWGdebug / SIXCDX / PostgreSQL 9.5 / LetoDB 2.15 / Java8
fabiano@ffsoft.com.br
Responder