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.