Página 1 de 2

MR-Print: Sistema de Impressão para Harbour

Enviado: 10 Out 2012 19:40
por Imatech
//*----------------------------------------------------------------------------*
//
// M., Ronaldo: Sistemas de Impressão para Harbour
//
// Class: MR_Print
//
// Uses: hbHPdf, hbZebra and hbMisc
//
//*----------------------------------------------------------------------------*
Download:
https://github.com/downloads/MRonaldo/M ... 121028.rar

Repositório ( GitHub ): Versões Atualizadas
https://github.com/MRonaldo/MR-Tools/downloads

/*
* MR-Tools source code:
*
* Copyright 2012 M., Ronaldo <ronmesq@gmail.com>
* https://github.com/MRonaldo/MR-Tools/downloads
*
* 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 site https://github.com/MRonaldo/MR-Tools/downloads
*
* As a special exception, the MR-Tool Project gives permission for
* additional uses of the text contained in its release.
*
* The exception is that, if you link the MR-Tools 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 MR-Tools 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 MR-Tools
* Project under the name MR-Tools. If you copy code from other
* MR-Tools Project or Free Software Foundation releases into a copy of
* MR-Tools, 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 MR-Print, it is your choice
* whether to permit this exception to apply to your modifications.
* If you do not wish that, delete this exception notice.
*
*/[/quote]

MR_Print: Sistema de Impressão para Harbour

Enviado: 11 Out 2012 23:20
por Imatech
//*----------------------------------------------------------------------------*
//
// M., Ronaldo: Sistemas de Impressão para Harbour
//
// Class: MR_Print
//
// Uses: hbHPdf, hbZebra, hbCT and hbMisc
//
//*----------------------------------------------------------------------------*
11/10/2012: Novos Recursos

1 - oMRPrint:ArrayToPDF( ... )
1.1 - Impressão de array bidimensional com elementos de tipos variados: String, Date, Logical and Numeric
1.1.1 - Recurso requisitado pelo Administrador do Forum HMG: Sr. Rathinagiri

2 - oMRPrint:Draw_Text_Rotated( ... )
2.1 - Impressão de texto em angulo de 0° a 360°
2.1.1 - Recurso requisitado pelo usuario do Forum FiveWin: Ukoenig
.
.
.
Sucesso...

MR_Print: Sistema de Impressão para Harbour

Enviado: 13 Out 2012 01:51
por cjp
Caros colegas,

Sou novo no Harbour e estou tentando aprender a imprimir.

Baixei o arquivo recomendado, tentei compilar, mas dá vários erros.

Alguém me ajuda?

Inacio

MR_Print: Sistema de Impressão para Harbour

Enviado: 13 Out 2012 05:23
por Imatech
Olá Cjp !
.
.
.
Segue o roteiro:

1 - DownLoad Harbour:
1.1 - Instalar na pasta padrão ( C:\HB32 ) ou conforme a sua preferencia ( ex: C:|harbour )
http://sourceforge.net/projects/harbour ... e/download

2 - DownLoad MR-Print:
2.1 - Extrair para a Pasta: C:\Projetos\MRPrint
https://github.com/downloads/MRonaldo/M ... 121012.rar

3 - Linha de Comando ( prompt de comando / msdos )
3.1 - Set path=c:\hb32\bin
3.2 - cd \Projetos\MRPrint
3.3 - Build.bat
.
.
.
Qualquer dúvida, esteja a vontade para novas perguntas
.
.
Sucesso...

MR_Print: Sistema de Impressão para Harbour

Enviado: 13 Out 2012 10:04
por asimoes
Olá Ronaldo,

Como é você faz o cálculo de posicionamento na página no fonte demo.prg

Essas variáveis 0.050, 0.950, 0.966 como é que funciona essas métricas?

oMRPrint:Draw_Line( ( oMRPrint:Page_Width___ * 0.050 ), ( oMRPrint:Page_Height__ * 0.966 ), ( oMRPrint:Page_Width___ * 0.950 ), ( oMRPrint:Page_Height__ * 0.966 ), 0.5 )

Parabéns pela sua contribuição.

[]´s

MR_Print: Sistema de Impressão para Harbour

Enviado: 13 Out 2012 18:32
por Claudio Soto
Hola Asimoes.

Realmente no conozco la biblioteca MP_Print, pero por inspección supongo que el formato de oMRPrint:Draw_Line es:
dibujar una linea de x1,y1 a x2,y2.

oMRPrint:Draw_Line( ( oMRPrint:Page_Width___ * 0.050 ), ( oMRPrint:Page_Height__ * 0.966 ), ( oMRPrint:Page_Width___ * 0.950 ), ( oMRPrint:Page_Height__ * 0.966 ), 0.5 )

entonces:
x1 = 5% del ancho de la página (oMRPrint:Page_Width___ * 0.050 )
x2 = 95% del ancho de la página (oMRPrint:Page_Width___ * 0.950 )
y1=y2= 96,6% de la altura de la página ( oMRPrint:Page_Height__ * 0.966)

Obviamente, 0.05 está en proporción no en porcentaje (5%/100=0.05).

Saludos,
Claudio Soto.

MR_Print: Sistema de Impressão para Harbour

Enviado: 14 Out 2012 02:00
por cjp
Caro Ronaldo,

Deu certo, consegui compilar e funcionou a impressão. Obrigado.

Entretanto, estou procurando algo mais simples, pois não consigo entender muito bem o teu código.

Queria os códigos para um relatório simples, sem muitas complicações.

Consegui com o colega Jairo um código para impressão que está me atendendo razoavelmente. A partir dele, montei uma função simples assim:

Código: Selecionar todos

aPNomes := {}
nprn=0
cInicio := "substr(produto,1,50) + space(3) + alltrim(str(prmaximo)) + space(1) + substr(unidade,1,16)"
 cCampos := "substr(produto,51,50) + space(3) + substr(unidade,17,20)"
 cFinal := "substr(produto,101,50) + space(3) + substr(unidade,36)"
 cCriterio := "Recno() >= 1 .And. Recno() < 2000"

 Go 1 // apenas para esse exemplo


function escimpr
         Local aPrn := Win_PrinterList( .t., .f. )
         Local i, oPrn, nMaxLen := 0
 
 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

return

Function PrintDados( cCampos, cCriterio )
 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

   nPrn=1
   nrpg=1
 oPrn :NewLine()
 oPrn :DispOutAt(1,1,"Produto a comprar:                                   Pre‡o m ximo:",,.t.)
 oPrn :TextOut("____________________________________________________________________________________")
 oPrn :NewLine()
 While &cCriterio. .And. !Eof()
       nPrn++

 oPrn :NewLine()
 oPrn :NewLine()
 oPrn :TextOut(&cInicio. )
 oPrn :NewLine()
 if !empty(&cCampos)
    oPrn :TextOut(&cCampos. ) 
    oPrn :NewLine()
 endif	
 if !empty(&cFinal)
	oPrn :TextOut(&cFinal)
    oPrn :NewLine()
 endif
 oPrn :TextOut("____________________________________________________________________________________")

 If nPrn>15
    nPrn=0
	oPrn :NewLine()
	oPrn :NewLine()
	oPrn :TextOut("                           P gina "+alltrim(str(nrpg)))
	oPrn :NewLine()
	nrpg++
 oPrn :NewPage()
 Endi

 Skip

 Endd
oPrn :NewLine()
oPrn :NewLine()
oPrn :TextOut("Se o pre‡o do produto estiver acima do pre‡o m ximo")
oPrn :NewLine()
oPrn :TextOut("indicado, nÆo compre, mas anote o pre‡o do produto.")
oPrn :NewLine()
oPrn :NewLine()
oPrn :NewLine()
	oPrn :TextOut("                           P gina "+alltrim(str(nrpg)))

 oPrn :EndDoc()
 oPrn :Destroy()


Return Nil

Entretanto, precisaria de algumas outras coisas:

1) como imprimir caracteres especiais, como negrito, fonte com tamanho maior, linhas verticais etc.
2) como faço para "descobrir" que a acabou a página, para passar para a próxima?
3) não estou conseguindo colocar um texto intercalado na linha "substr(produto,1,50) + space(3) + alltrim(str(prmaximo)) + space(1) + substr(unidade,1,16)"

Será que dá pra me ajudar quanto a isto? Obrigado.

MR_Print: Sistema de Impressão para Harbour

Enviado: 14 Out 2012 13:10
por Imatech
Olá A.Simoes !

Olá Ronaldo,
Como é você faz o cálculo de posicionamento na página no fonte demo.prg
/* Default: 72 dpi */
A Classe MR-Print usa coordenadas em pixels:



/* HPDF_PAGE_SIZE_A4 */
Para Página A4, temos como retorno ( Defult para o modo Retrato/Portrait):

oMRPrint:Page_Width___ = 595.276 /* largura */
oMRPrint:Page_Height__ = 841.890 /* altura */


As coordenadas ( parâmetros ) informadas são em pixels, porem a seu crítério pode usar conversões para cm/mm se isso facilitar seu entendimento

( Medidas em Pelegadas: )
oMRPrint:Page_Width___ / 72 = 8,26772222222222 /* largura */
oMRPrint:Page_Height__ / 72 = 11,6929166666667 /* altura */


( Medidas em cm: )
( oMRPrint:Page_Width___ / 72 ) * 2.54 = 21,00 /* largura */
( oMRPrint:Page_Height__ / 72 ) * 2.54 = 29,70 /* altura */


( Medicas em mm: )
( oMRPrint:Page_Width___ / 72 ) * 25.4 = 210 /* largura */
( oMRPrint:Page_Height__ / 72 ) * 25.4 = 297 /* altura */


Essas variáveis 0.050, 0.950, 0.966 como é que funciona essas métricas?
A forma que utilizo no exemplo se baseia em frações ( % do tamanho da página ) e se ajusta a qualquer tamanho de papel, forma ( retrato/paisagem ) ou resolução, perfeito para desenho livre
Para o exemplo utilizado, obtemos os seguintes valores

/* Pixels */
oMRPrint:Page_Width___ * 0.050 = 29,76380
oMRPrint:Page_Height__ * 0.966 = 813,26574
oMRPrint:Page_Width___ * 0.950 = 565,51220
oMRPrint:Page_Height__ * 0.966 = 813,26574

/* Conversoes */

/* Polegadas */
0,413386111
11,295357500
7,854336111
11,295357500

/* Centimetros */
1,050000722
28,690208050
19,950013720
28,690208050

/* Milimetros */
10,50000722
286,90208050
199,50013720
286,90208050



Para compatibilidade com o padrão cli*per voce pode dividir a altura da página pelo numero de linhas desejado, ex:

Código: Selecionar todos

/* Nova página A4 em modo retrato */
oMRPrint:AddPage( .T. )

/* Máximo de Linhas por Página */
nLinhasPorPagina :=  66

/* Máximo de Caracteres por linha */
nCPL____________ := 132

/* Altura exata de cada Linhas a ser impressa */
nAltura_da_Linha := oMRPrint:Page_Height__ / nLinhasPorPagina

/* Largura Projetada por caractere : Projeção para fonte Tamanho 7 */
/* Podemos obter a capacidade máxima em caracteres via código para qualquer tipo de fonte e tamanho, mas vamos deixar para outro tutorial */
nLarguraCaracter := oMRPrint:Page_Width___ / nCPL____________

/* Pósição Vertical para Impressão */
nPosiçãoVertical := nAltura_da_Linha * 2

/* Pósição Horizontal para Impressão */
nPosiçãoHorizont := ( oMRPrint:Page_Width___ / 132 ) * 10

For i := 1 TO ( nLinhasPorPagina - 4 )

  nPosiçãoVertical += nAltura_da_Linha
  oMRPrint:Draw_Text( nPosiçãoHorizont + 0, nPosiçãoVertical, hb_NToS( i ), ::oFont_F______, 7 )
  oMRPrint:Draw_Text( nPosiçãoHorizont + ( nLarguraCaracter * 100 ), nPosiçãoVertical, hb_NToS( i ), ::oFont_F______, 7 )
  
End

:)Pos
Parabéns pela sua contribuição
Obrigado... e qquer dúvida: pergunte a vontade, pois assim ajuda no desenvolvimento e novas formar para facilitar o uso da Classe
.
.
.

MR_Print: Sistema de Impressão para Harbour

Enviado: 14 Out 2012 13:59
por Imatech
Olá CJP !


Caso sua requisição seja sobre: Win_Prn() - Favor postar suas dúvidas no Tópico do nosso amigo Jairo...
.
.
.
Segue seu exemplo em MR-Print ( Não Testado ):

Código: Selecionar todos


Procedure Main( ... )

   Local i, oPrn, nMaxLen := 0
   Local cInicio := "substr(produto,1,50) + space(3) + alltrim(str(prmaximo)) + space(1) + substr(unidade,1,16)"
   Local cCampos := "substr(produto,51,50) + space(3) + substr(unidade,17,20)"
   Local cFinal := "substr(produto,101,50) + space(3) + substr(unidade,36)"
   //*----------------------------------------------------------------------*
   // MR_Print()
   //*----------------------------------------------------------------------*
   Local cFilePdf := 'MR_Print.PDF'
   Local oMRPrint := MR_Print():New( cFilePdf )
   /* Máximo de Linhas por Página : Informe o valor que desejar */
   Local nLinhasPorPagina :=  77
   /* Máximo de Caracteres por linha : Informe o valor que desejar */
   Local nCPL____________ :=  98
   Local nAltura_da_Linha
   Local nLarguraCaracter
   Local nPosiçãoVertical
   Local nPosiçãoHorizont

   ...

   Go 1 // apenas para esse exemplo

   //*-------------------------------------------------------------------------*
   // ::AddPage( lRetrato ) -> ( .F. ) == Modo Paisagem
   //*-------------------------------------------------------------------------*
   oMRPrint:AddPage( .T. )

   /* Altura exata de cada Linhas a ser impressa */
   nAltura_da_Linha := oMRPrint:Page_Height__ / nLinhasPorPagina

   /* Largura Projetada por caractere */
   nLarguraCaracter := oMRPrint:Page_Width___ / nCPL____________

   /* Pósição Vertical para Impressão */
   nPosiçãoVertical := nAltura_da_Linha *  2

   /* Pósição Horizontal para Impressão */
   nPosiçãoHorizont := nLarguraCaracter * 10

   //*----------------------------------------------------------------------*
   // PRINT TEXT - Draw_Text( nLeft, nTop, cTxt, oFont, nSize )
   //*----------------------------------------------------------------------*
   nPosiçãoVertical += nAltura_da_Linha
   oMRPrint:Draw_Text( nPosiçãoHorizont + 0, nPosiçãoVertical, 'Produto a comprar:', ::oFont_F______, 9 )
   oMRPrint:Draw_Text( nPosiçãoHorizont + ( nLarguraCaracter * 66 ), nPosiçãoVertical, 'Preço máximo:', ::oFont_F______, 9 )

   //*----------------------------------------------------------------------*
   // PRINT LINE - Draw_Line( x, y, w, z, 0.5 ) : TOP
   //*----------------------------------------------------------------------*
   nPosiçãoVertical += nAltura_da_Linha
   oMRPrint:Draw_Line( ( nPosiçãoHorizont + 0, nPosiçãoVertical + 0, nPosiçãoHorizont + ( nLarguraCaracter * 84 ), nPosiçãoVertical + 0, 0.5 )

   //*----------------------------------------------------------------------*
   // Line++
   //*----------------------------------------------------------------------*
   nPosiçãoVertical += nAltura_da_Linha

   While ( Recno() >= 1 .And. Recno() < 2000 ) .And. !( Eof() )

      nPosiçãoVertical += nAltura_da_Linha * 2
      oMRPrint:Draw_Text( nPosiçãoHorizont + 0, nPosiçãoVertical, ( &cInicio. ), ::oFont_F______, 9 )

      nPosiçãoVertical += nAltura_da_Linha * 2

      if !empty( &cCampos )
         oMRPrint:Draw_Text( nPosiçãoHorizont + 0, nPosiçãoVertical, ( &cCampos. ), ::oFont_F______, 9 )
         nPosiçãoVertical += nAltura_da_Linha * 2
      endif

      if !empty(&cFinal)
         oMRPrint:Draw_Text( nPosiçãoHorizont + 0, nPosiçãoVertical, ( &cFinal. ), ::oFont_F______, 9 )
         nPosiçãoVertical += nAltura_da_Linha * 2
      endif

      nPosiçãoVertical += nAltura_da_Linha * 2
      oMRPrint:Draw_Line( ( nPosiçãoHorizont + 0, nPosiçãoVertical + 0, nPosiçãoHorizont + ( nLarguraCaracter * 84 ), nPosiçãoVertical + 0, 0.5 )


      If nPosiçãoVertical > ( nAltura_da_Linha * 15 )

         nPosiçãoVertical := nAltura_da_Linha *  2

         oMRPrint:Draw_Text( nPosiçãoHorizont + ( nLarguraCaracter * 10 ), nPosiçãoVertical, "Página: "+hb_NToS(nrpg), ::oFont_F______, 9 )
         nPosiçãoVertical += nAltura_da_Linha * 2
         nrpg++
         oMRPrint:AddPage( .T. )

      End

      Skip

      nPosiçãoVertical += nAltura_da_Linha * 2

   Endd

   nPosiçãoVertical += nAltura_da_Linha * 2
   oMRPrint:Draw_Text( nPosiçãoHorizont + 0, nPosiçãoVertical, "Se o preço do produto estiver acima do preço máximo...", ::oFont_F______, 9 )

   nPosiçãoVertical += nAltura_da_Linha * 2
   oMRPrint:Draw_Text( nPosiçãoHorizont + 0, nPosiçãoVertical, "indicado, não compre, mas anote o preçoo do produto.", ::oFont_F______, 9 )

   nPosiçãoVertical += nAltura_da_Linha * 4
   oMRPrint:Draw_Text( nPosiçãoHorizont + ( nLarguraCaracter * 10 ), nPosiçãoVertical, "Página: "+hb_NToS(nrpg), ::oFont_F______, 9 )

   //*----------------------------------------------------------------------*
   // END JOB: CREATE PDF
   //*----------------------------------------------------------------------*
   oMRPrint:Finish()
   
   IF hb_FileExists( cFilePdf )

      hb_Run( "Explorer.exe " + cFilePdf )

   ELSE

      ALERT( 'ERRO NA GERACAO DO ARQUIVO...;;' + cFilePdf )

   ENDIF

Return( Nil )

*** O uso de Macros ( & ) se configura em práticas não recomendadas de programação ***
.
.
.
Entretanto, precisaria de algumas outras coisas:

1) como imprimir caracteres especiais, como negrito, fonte com tamanho maior, linhas verticais etc.
2) como faço para "descobrir" que a acabou a página, para passar para a próxima?
3) não estou conseguindo colocar um texto intercalado na linha "substr(produto,1,50) + space(3) + alltrim(str(prmaximo)) + space(1) + substr(unidade,1,16)"
1.1 - Caracteres especiais, Linhas e Colunas já existem na classe desde o 1º release...
1.2 - Negrito, Itálico e Sublinhado: Aguarde o próximo release

2.1 - Tamanho da Página / Numero de Linhas

3.1 - MR-Print é desenho livre: Basta informar as coordenadas desejadas e o objeto desejado será impresso...
.
.
.

MR_Print: Sistema de Impressão para Harbour

Enviado: 15 Out 2012 15:46
por Imatech
//*----------------------------------------------------------------------------*
//
// M., Ronaldo: Sistemas de Impressão para Harbour
//
// Class: MR_Print
//
// Uses: hbHPdf, hbZebra, hbCT and hbMisc
//
//*----------------------------------------------------------------------------*
15/10/2012: Novos Recursos

Fontes Disponiveis:

Courier
Courier-Negrito
Courier-Itálico
Courier-( Negrito + Itálico )

Helvetica
Helvetica-Negrito
Helvetica-Itálico
Helvetica-( Negrito + Itálico )
.
.
.
DownLoad:
https://github.com/downloads/MRonaldo/M ... 121015.rar
.
.
.
Repositório ( GitHub ):
https://github.com/MRonaldo/MR-Tools/downloads
.
.
.
Sucesso...

MR_Print: Sistema de Impressão para Harbour

Enviado: 16 Out 2012 23:38
por cjp
Caro Ronaldo,

Teu exemplo está dando algum erro na compilação, mas não consigo saber exatamente onde, pois dá o mesmo erro em várias linhas que não têm nada a ver.

Imagem

Não consigo ver a primeira linha onde dá esse erro, pois passa muito rápido. Tentei colocar o resultado num arquivo de texto com >arquivo.txt, mas não funciona.

Foi o próprio Jairo quem me recomendou ver o teu post. Na verdade eu não entendo nada a este respeito. Apenas estou procurando uma forma simples de imprimir via Harbour. Usava tranquilamente set print to no xHarbour, funcionava bem. Por que isso não funciona no Harbour.

Tem macros no meu sistema? Onde?

Inacio

MR_Print: Sistema de Impressão para Harbour

Enviado: 17 Out 2012 00:35
por Imatech
Olá Inácio ( CJP ) !

Aparentemente a linha 096 do exemplo que passei contem o erro:
096 Endd
corrigir para:

Código: Selecionar todos

   End
Que editor esta usando para seu código ?


Sucesso...

MR_Print: Sistema de Impressão para Harbour

Enviado: 17 Out 2012 01:48
por cjp
Desculpe, percebi depois que o problema era na acentuação. Tirei.

Mas mesmo assim está dando um erro de compilação nas seguintes linhas:

Código: Selecionar todos

 oMRPrint:Draw_Line( ( nPosicaoHorizont + 0, nPosicaoVertical + 0, nPosicaoHorizont + ( nLarguraCaracter * 84 ), nPosicaoVertical + 0, 0.5 )

Código: Selecionar todos

   oMRPrint:Draw_Line( ( nPosicaoHorizont + 0, nPosicaoVertical + 0, nPosicaoHorizont + ( nLarguraCaracter * 84 ), nPosicaoVertical + 0, 0.5 )
O erro é de Incomplete statement or unbalanced delimiters. E realmente falta um fecho do parêntese. Testei colocá-lo em vários lugares, mas daí dá o erro Meaningless use of expression 'Numeric'. Daí eu não entendi.

Inacio

MR_Print: Sistema de Impressão para Harbour

Enviado: 17 Out 2012 09:47
por asimoes
Olá Ronaldo,

Execelente a sua contribuição.

Pergunta:
Tem como imprimir um texto com cor além do preto?

[]´s

MR_Print: Sistema de Impressão para Harbour

Enviado: 17 Out 2012 10:01
por Pablo César
Imatech (Ronaldo) escreveu:O uso de Macros ( & ) se configura em práticas não recomendadas de programação
Baseado em quê você formou esse conceito ? Poderia explicar-nos ? Eu não vejo como uma prática não recomendada, justamente o conceito diz que é uma das mais poderosas funcionalidades da linguagem xBase veja e se fosse uma prática não recomendada, não teria mais 676 itens sobre macro no Harbour Reference entre funções e referências.