Clipper On Line • Ver Tópico - Impressão com MiniGui - Fatos Curiosos!!!

Impressão com MiniGui - Fatos Curiosos!!!

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

 

Impressão com MiniGui - Fatos Curiosos!!!

Mensagempor yugi386 » 24 Jul 2008 11:17

Olá amigos. Meu nome é Yugi. Antes de tudo quero parabenizar a todos. Quando ainda não tinha me registrado pude aprender muito com as mensagens de todos vcs e agora espero aprender cada vez mais.
Bem, eu sou clippeiro a algum tempo e agora estou entusiasmado com o harbour. Contudo, pude observar que para imprimir em harbour é necessário fazer muitos "malabarismos". Não consegui imprimir em um sistema que fiz utilizando a minigui 2.5.2 do roberto lopez em modo console. Os comandos da miniprint não funcionam neste modo e nem os comandos do clipper como SET PRINTER TO... também utilizei somente o harbour com o BCC55 mapar linkar mas os comandos do clipper também não funcionaram, mesmo em uma impressora matricial plugada em LPT1.
Gostaria que alguém me desse alguma dica de como fazer o aplicativo compilado com harbour em modo console imprimir em qualquer impressora, sem alterar muito o código da aplicação.

Outra coisa que estive observando é o seguinte:
_________________________________________

Compilei o seguinte codigo com a minigui 2.5.2 (com o harbour 1.0.ORC2 Intl. que já vem junto com ela). O compilador utilizado é o GCC (também já está no pacote). Ele funcionou perfeitamente. reparem que eu estava tentando fazer uma função de impressão simples utilizando os comandos de impressão da minigui. Segue abaixo o código: (alguns caracteres aparecem bagunçados porque o arquivo foi criado com EDIT, em anexo segue o arquivo a.prg e acao.dbf utilizados)

/*
----------------------------------------------------------------
Biblioteca de fun‡äes para impressÆo com HARBOUR-MINIGUI
----------------------------------------------------------------

Objetivo....: Imprimir relat¢rios de texto sem complica‡Æo.
Muito semelhante … sintaxe do Clipper!!!

Obs.........: Todas as configura‡äes de margens e espa‡amentos
sÆo v lidas para papel A4!
O n£mero m ximo de colunas na p gina ‚ de 80.
A fonte de impressÆo ‚ 'Couriew New', tamanho 11.

Limita‡äes..:  preciso concatenar todas as strings que serÆo
impressas em uma mesma linha.

Programador.: Yugi Tumro
Data........: 25/05/2007
*/

#include "minigui.ch"

Function Main()

PARAMETERS lNomeArq // Parametro da linha de comando!!!

if lnomearq == NIL
lnomearq := " "
endif

* Abaixo temos as vari veis de configura‡Æo de impressÆo:

XTIPO := 80

DO CASE
CASE XTIPO == 80
*-------------------------------------------------------------------------------
* ATEN€ÇO: ESTA CONFIGURA€ÇO  PARA 80 COLUNAS!!!
*-------------------------------------------------------------------------------
PUBLIC MARGEM_SUPERIOR := 3 // 3 linhas na margem superior
PUBLIC MARGEM_ESQUERDA := 12 // 1.2 cm

PUBLIC TOTAL_LINHAS := 60 // Total de linhas de texto por p gina
// O n£mero m ximo de linhas ‚ 66

PUBLIC ENTRE_LINHAS := 4.5 //  o espa‡o entre as linhas
// 45 mm ‚ o valor padrÆo
PUBLIC SALTO_PAGINA := .T. // Considera o salto de p ginas!

XSIZETAM := 11
*-------------------------------------------------------------------------------

CASE XTIPO == 132
*-------------------------------------------------------------------------------
* ATEN€ÇO: ESTA CONFIGURA€ÇO  PARA 132 COLUNAS!!!
*-------------------------------------------------------------------------------
PUBLIC MARGEM_SUPERIOR := 5 // 5 linhas na margem superior
PUBLIC MARGEM_ESQUERDA := 11 // 11 cm

PUBLIC TOTAL_LINHAS := 83 // Total de linhas de texto por p gina
// O n£mero m ximo de linhas ‚ 93

PUBLIC ENTRE_LINHAS := 3.0 //  o espa‡o entre as linhas
// 30 mm ‚ o valor padrÆo
PUBLIC SALTO_PAGINA := .T. // Considera o salto de p ginas!
XSIZETAM := 7.5
*-------------------------------------------------------------------------------

CASE XTIPO == 110
*-------------------------------------------------------------------------------
* ATEN€ÇO: ESTA CONFIGURA€ÇO  PARA 110 COLUNAS!!!
*-------------------------------------------------------------------------------
PUBLIC MARGEM_SUPERIOR := 4 // 4 linhas na margem superior
PUBLIC MARGEM_ESQUERDA := 11.5 // 11.5 cm

PUBLIC TOTAL_LINHAS := 70 // Total de linhas de texto por p gina
// O n£mero m ximo de linhas ‚ 78

PUBLIC ENTRE_LINHAS := 3.8 //  o espa‡o entre as linhas
// 30 mm ‚ o valor padrÆo
PUBLIC SALTO_PAGINA := .T. // Considera o salto de p ginas!
XSIZETAM := 8.5
*-------------------------------------------------------------------------------

ENDCASE

SET LANGUAGE TO PORTUGUESE

/* ABAIXO O MAPA DAS CORES SIMPLES:
YELLOW , PINK , RED , FUCHSIA , BROWN , ORANGE , GREEN
PURPLE , BLACK , BLUE
*/

DEFINE WINDOW Win_1 ;
AT 0,0 ;
WIDTH 300 ;
HEIGHT 150 ;
TITLE Winletra('Aguarde, Imprimindo...') ;
NOSYSMENU;
ON INIT IMPRIMIR(lnomearq);
MAIN

/*
DEFINE MAIN MENU
DEFINE POPUP 'Iniciar'
MENUITEM 'Imprimir Testes' ACTION Imprimir()
END POPUP
END MENU
*/

END WINDOW

If !MsgYesNo(Winletra("Imprimir Arquivo " + Upper(lNomeArq) + "?"),"Imprimir")
RELEASE ALL // FECHA PROGRAMA
Return
Endif

CENTER WINDOW Win_1
ACTIVATE WINDOW Win_1

Return

******************************************************************************

Procedure Imprimir(lNomeArq)
Local cPrinter, xlin:=0, clinha:=0, xcol:=0, num:=0, limite:=0

/*
If !MsgYesNo(Winletra("Imprimir Arquivo " + Upper(lNomeArq) + "?"),"Imprimir")
WIN_1.RELEASE // FECHA PROGRAMA
Return
Endif
*/

/*
cPrinter := GetPrinter()

If Empty (cPrinter)
MsgStop(Winletra("NÆo h  uma impressora instalada!"),"Erro")
WIN_1.RELEASE // FECHA PROGRAMA
Return
Endif

* Alternativamente:
SELECT PRINTER cPrinter ;
ORIENTATION PRINTER_ORIENT_PORTRAIT ;
PAPERSIZE PRINTER_PAPER_LETTER ;
QUALITY PRINTER_RES_MEDIUM
*/

SELECT PRINTER DEFAULT ;
ORIENTATION PRINTER_ORIENT_PORTRAIT ;
PAPERSIZE PRINTER_PAPER_A4 ;
QUALITY PRINTER_RES_HIGH

*-------------------------------------
* ImpressÆo facilitada com harbour:
*-------------------------------------

LigaPrint() // Ligando a Impressora!

limite := TOTAL_LINHAS+MARGEM_SUPERIOR // Limite da p gina!
xcol := MARGEM_ESQUERDA // Coluna Inicial

* a vari vel clinha indica o limite de linhas da pagina
* e permite efetuar o salto de p ginas conforme est  mais abaixo

* Primeira P gina:
IniciaPag(@xlin,@clinha) // Iniciando a P gina!

Print_Linha(@xlin,@clinha,"C")
Print_texto(@xlin,@clinha,"IMPRIMINDO COM HARBOUR","C","N")
Print_Linha(@xlin,@clinha,"T")

Print_texto(@xlin,@clinha,WINLETRA("Alinha … esquerda"),"E","I")
Print_texto(@xlin,@clinha,Winletra("Ao centro"),"C")
Print_texto(@xlin,@clinha,Winletra("Alinha … direita"),"D","NI")

Print_Linha(@xlin,@clinha,"C")

@ Xlin,margem_esquerda PRINT REPLICATE("0123456789",11) FONT "Courier New" SIZE XSIZETAM COLOR RED BOLD
XLIN := XLIN + entre_linhas

use acao
go top

For Num := 1 to 100
* Print_texto(@xlin,@clinha,str(num),,"I",BLUE)
* Print_texto(@xlin,@clinha,REPLICATE("0123456789",13)+("01"),,"N",BLACK)
Print_texto(@xlin,@clinha,ACAO->CODIGO + " " + ACAO->ACAO,,"N",BLACK)

SKIP

* Aqui abaixo temos o controle para salto de p ginas
if clinha > LIMITE
Pulapag()
IniciaPag(@xlin,@clinha) // Iniciando a P gina!
endif
next

close all
PulaPag() // Pula P gina ao final
DesligaPrint() // Desligando a Impressora

msginfo(winletra("ImpressÆo terminada!"),winletra("Conclu¡do"))
WIN_1.RELEASE // FECHA PROGRAMA

Return
************************************************************************************

PROCEDURE Print_texto(lin,varlin,texto,posic,form,xcor)
Local lTam:=0, formato:=" ",lct:=0

* OBS: a vari vel varlin ‚ um parƒmetro passado por referencia
* destina-se a contar as linhas para o salto de p gina!
* o mesmo acontece com a vari vel lin (por referencia!)

IF SALTO_PAGINA // Considera ou nÆo o salto de p ginas!!!
varlin := varlin + 1
ENDIF

ltam:=len(alltrim(texto)) // Lendo tamanho da string

if posic <> NIL
posic := upper(posic)
else
posic := "E"
Endif

* posic indica impressÆo … esquerda "E"
* centralizada "C"
* … direita "D"

If posic <> "C" .and. posic <> "E" .and. posic <> "D"
posic:= "E"
Endif

/*
form indica a formata‡Æo das letras:
Negrito "N"
It lico "I"
Negrito & Italico "NI"
*/

* Controle de formata‡Æo da letra:
If form == NIL .or. len(form) > 2
form := " "
else
form := upper(form)
Endif

* Controle de cores para impressÆo:
If xcor == NIL
xcor := BLACK
Endif

* Verificando posi‡Æo:
Do case
case posic == "C" // Centralizado
texto := Replicate(" ",Int((XTIPO-ltam)/2)) + texto
case posic == "D" // … direita
texto := replicate(" ",XTIPO-ltam) + texto
Endcase

* Imprimindo:
Do case
case form == "N"
@ lin,MARGEM_ESQUERDA PRINT texto FONT "Courier New" SIZE XSIZETAM COLOR xcor BOLD
case form == "I"
@ lin,MARGEM_ESQUERDA PRINT texto FONT "Courier New" SIZE XSIZETAM COLOR xcor ITALIC
case form == "NI"
@ lin,MARGEM_ESQUERDA PRINT texto FONT "Courier New" SIZE XSIZETAM COLOR xcor BOLD ITALIC
otherwise
@ lin,MARGEM_ESQUERDA PRINT texto FONT "Courier New" SIZE XSIZETAM COLOR xcor
Endcase

* Reposicionando o ponteiro de impressÆo:
lin:= lin + ENTRE_LINHAS

Return NIL

******************************************************************************
Procedure Print_linha(lin,varlin,tipo,xcor) // Imprime uma Linha na Impressora

* OBS: a vari vel varlin ‚ um parƒmetro passado por referencia
* destina-se a contar as linhas para o salto de p gina!
* o mesmo acontece com a vari vel lin (por referencia!)

IF SALTO_PAGINA // Considera ou nÆo o salto de p ginas!!!
varlin := varlin + 1
ENDIF

* vari vel tipo indica:
* linha ininterrupta "C"
* linha tracejada "T"

if tipo == NIL
tipo := "C"
elseif len(tipo) = 1
tipo := upper(tipo)
else
tipo := "C"
Endif

If xcor == NIL
xcor := BLACK
Endif

If tipo == "T"
@ Lin,MARGEM_ESQUERDA PRINT replicate("-",XTIPO) FONT "Courier New" COLOR xcor SIZE XSIZETAM
else
@ Lin,MARGEM_ESQUERDA PRINT replicate(" ",XTIPO) FONT "Courier New" COLOR xcor SIZE XSIZETAM STRIKEOUT
Endif

* Reposicionando o ponteiro de impressÆo:
lin:= lin + ENTRE_LINHAS

Return NIL
**********************************************************************************

* ---------------------------------------------------------------------------
* Abaixo temos as quatro fun‡äes b sicas para controle da impressora
* ---------------------------------------------------------------------------
Procedure LigaPrint() // Iniciando a impressora!
START PRINTDOC
Return

Procedure DesligaPrint() // Desligando a impressora!
END PRINTDOC
Return

Procedure IniciaPag(xlin,clinha) // Iniciando uma p gina!
START PRINTPAGE
clinha:= MARGEM_SUPERIOR+1 // Contador de linhas
xlin :=0
xlin := xlin+(MARGEM_SUPERIOR*ENTRE_LINHAS) // Linha inicial da p gina

Return

Procedure PulaPag() // Efetuando o salto de p gina!
END PRINTPAGE
Return
*******************************************************************************

/*


ÛßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÛ
Û 014 = WINLETRA(palavra) Û
Û OBJETIVO......: Converte a tabela de acentos do MS-DOS para o padrÆo do Û
Û WINDOWS. étil quando se vai imprimir acentos ou gerar Û
Û relat¢rios que possam ser lidos por editores de texto Û
Û do WINDOWS. Û
ÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛ
*/

Function WINLETRA(palavra)
Local lnum:=0, lf1:= " Š‹Œä¢•”“£—–¤ì˜‡Çµ·Ž¶ÔÓÒÖÞØ×åàã™âéëšê¥íY€§¦",;
lf2:= "áèïîõóòöôúùüûñýÿçÃÁÀÄÂÉÈËÊÍÌÏÎÕÓÒÖÔÚÙÜÛÑÝYǺª", ltam:=0,;
ltamp:=0,;
lf3:={ CHR(198), CHR(133), CHR(132), CHR(131), CHR(130),;
CHR(137), CHR(136), CHR(161), CHR(141) },;
lf4:={ CHR(227), CHR(224), CHR(228), CHR(226), CHR(233),;
CHR(235), CHR(234), CHR(237), CHR(236) }

ltamp:=len(palavra) // Tamanho da palavra
ltam:= len(lf1)

For lnum:= 1 to ltam
palavra := StrTran(palavra,Substr(lf1,lnum,1),;
Substr(lf2,lnum,1))
Next

* Controle especial para caracteres que conflitam com o MS-DOS.

For lct:= 1 to 9
For lnum:= 1 to len(palavra)
if Substr(Palavra,lnum,1) == lf3[lct]
Palavra:= Stuff(palavra,lnum,1,lf4[lct])
Endif
Next
Next

Return(palavra)
********************************************************************************

Como vi que a maioria de vcs usam a minigui 1.5 extended edition eu resolvi compilar o codigo com ela também.
Mas aí apareceram os seguintes erros:

a.prg(155) Error E0030 Syntax error: "syntax error at 'PRINTER'"
a.prg(182) Error E0030 Syntax error: "syntax error at '@'"
a.prg(269) Error E0030 Syntax error: "syntax error at '@'"
a.prg(271) Error E0030 Syntax error: "syntax error at '@'"
a.prg(273) Error E0030 Syntax error: "syntax error at '@'"
a.prg(275) Error E0030 Syntax error: "syntax error at '@'"
a.prg(312) Error E0030 Syntax error: "syntax error at '@'"
a.prg(314) Error E0030 Syntax error: "syntax error at '@'"
a.prg(327) Error E0030 Syntax error: "syntax error at 'PRINTDOC'"
a.prg(331) Error E0030 Syntax error: "syntax error at 'END'"
a.prg(335) Error E0030 Syntax error: "syntax error at 'PRINTPAGE'"
a.prg(343) Error E0030 Syntax error: "syntax error at 'END'"

Compile error.

Pressione qualquer tecla para continuar. . .

*************************************************************************
Eu não mexi em nada no arquivo e ele simplemente não compilou. Alguém de vcs sabe o motivo?

Grato desde já por tudo.

Yugi.
Anexos
acao.txt
favor renomear acao.txt acao.dbf é que o forum não permite o envio de arquivos DBF.
(24.01 KiB) Baixado 149 vezes
A.PRG
fonte postado na mensagem - para edit do ms-dos
(12.8 KiB) Baixado 176 vezes
yugi386
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 82
Data de registro: 24 Jul 2008 10:36
Cidade/Estado: Minas Gerais
Curtiu: 0 vez
Mens.Curtidas: 27 vezes

Re: IMPRESSÃO COM MINIGUI - FATOS CURIOSOS!!!

Mensagempor yugi386 » 24 Jul 2008 13:19

Quanto a impressão em modo grafico usando miniprint com minigui extended 1.5 eu descobri acidentalmente a razão:
É necessário declarar:

#include "minigui.ch"
#include "miniprint.ch"

se vc não incluir a última linha não compila em minigui extended 1.5. Se vc usa minigui 2.5.2 de roberto lopez não inclua a segunda linha [ #include "miniprint.ch"] pois o pacote minigui 2.5.2 não contém este arquivo mas compila normalmente.

Quanto a impressão em modo console continua a incógnita: qual é o comando de impressão para se imprimir em qualquer impressora (no windows XP)?

Grato,

Yugi.
yugi386
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 82
Data de registro: 24 Jul 2008 10:36
Cidade/Estado: Minas Gerais
Curtiu: 0 vez
Mens.Curtidas: 27 vezes

Re: IMPRESSÃO COM MINIGUI - FATOS CURIOSOS!!!

Mensagempor Hasse » 24 Jul 2008 19:00

Voce ja tentou usar a Classe Win32prn(), nativa do xHarbour ?

Eu já a uso faz mais de 3 anos, e funciona muito bem. Tem todos os recursos de que necessito.

Veja um exemplo em:
viewtopic.php?f=4&t=6465&p=32060&hilit=+win32prn+win32prn+para+iniciantes#p32060

Eu não testei a impressão via Classe Win32prn() em ambiente gráfico MiniGui, mas até hoje ninguém ainda reportou algum problema do tipo, portanto parto do princípio que ela deve funcionar.

De qualquer forma localizei no meu HD um exemplo para impressão com MiniGui. Também não testei. Segue no Anexo.
Anexos
miniprint_list.zip
(2.93 KiB) Baixado 312 vezes
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
Avatar de usuário

Hasse
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 815
Data de registro: 19 Out 2004 10:30
Cidade/Estado: Jaraguá do Sul - SC
Curtiu: 0 vez
Mens.Curtidas: 24 vezes

Re: IMPRESSÃO COM MINIGUI - FATOS CURIOSOS!!!

Mensagempor yugi386 » 29 Jul 2008 10:14

Obrigado pela dica Hasse.
Eu não conseguia compilar a classe win32prn porque estava utilizando harbour e esta classe só faz parte do xharbour.
Vou tentar fazer algumas adaptações no seu código de exemplo para que a impressão se pareça mais com o sistema do clipper. A idéia é emcapsular os objetos em funções e utilizar parãmetros para usá-los. Sabe, eu detesto programação orientada a objetos; sou um fã incondicional da programação estruturada. Ela é rápida para codificar e não tem todos aqueles detalhes chatos.
Outra coisa que aprendi foi o seguinte:
ao utilizar o arquivo de lote compile.bat do diretório \MINIGUI\BATCH para compilar os arquivos é necessário digitar:

compile [nome arquivo] /X /C para copilar em xharbour console e
compile [nome arquivo] /C para copilar em harbour console.

É necessário instalar o xharbour na pasta \xharbour.

Estas são coisas simples mas para o iniciante como eu na linguaguem é uma dor de cabeça.
Obrigado pelas dicas.
yugi386
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 82
Data de registro: 24 Jul 2008 10:36
Cidade/Estado: Minas Gerais
Curtiu: 0 vez
Mens.Curtidas: 27 vezes

Re: IMPRESSÃO COM MINIGUI - FATOS CURIOSOS!!!

Mensagempor sygecom » 29 Jul 2008 11:16

Parte da Win32prn já tem no Harbour, basta linkar a 'xhb.lib' que vai compilar o exemplo do Hasse.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
leonardodemachado@hotmail.com

Faça você também sua doação esse fórum é uma lenda viva: http://www.pctoledo.com.br/doacao
Avatar de usuário

sygecom
Usuário Nível 7

Usuário Nível 7
 
Mensagens: 7017
Data de registro: 21 Jul 2006 10:12
Cidade/Estado: Alvorada-RS
Curtiu: 1 vez
Mens.Curtidas: 133 vezes

Re: IMPRESSÃO COM MINIGUI - FATOS CURIOSOS!!!

Mensagempor Hasse » 29 Jul 2008 13:43

Estamos todos no mesmo barco. E, para que ele siga em frente, todos devemos remar no mesmo ritmo e mesma direção.

Portanto, aqui estamos, para ajudar e sermos ajudados.

Bom trabalho.
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
Avatar de usuário

Hasse
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 815
Data de registro: 19 Out 2004 10:30
Cidade/Estado: Jaraguá do Sul - SC
Curtiu: 0 vez
Mens.Curtidas: 24 vezes




Retornar para MiniGui

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 6 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro