Página 1 de 2

Converter de Clipper para Harbour - Parte II

Enviado: 03 Mar 2015 18:24
por aprendiz_ce
Prezados,

Para imprimir os relatórios do meu aplicativo que antes era em Clipper 5.x e agora está em Harbour 3.2 é necessário mudar alguma coisa ou posso manter como está? Adoraria passar a usar "WIN_PrinterList()" e "WIN_PrinterGetDefault()" mas confesso que não sei como fazer. Dei uma olhada pelo fórum, mas não encontrei nada bem simples que eu pudesse tomar como base para entender e ver como proceder. Sendo assim, ainda estou usando "Set Device To Print","Set Device To Screen" e "Set Printer To". Pelo que encontrei no fórum fiz uns testes com "WIN_PrinterList()" e "WIN_PrinterGetDefault()" e achei bem legal, só não sei com utilizar para das saída para uma impressora matricial.

Preciso de uma ajuda do colegas para manter o mesmo código para Windows e Linux. Será que alguém poderia me dar umas dicas?

Obrigado a todos.

Converter de Clipper para Harbour - Parte II

Enviado: 04 Mar 2015 00:06
por alxsts
Olá!

Veja este tópico.

Converter de Clipper para Harbour - Parte II

Enviado: 04 Mar 2015 10:32
por aprendiz_ce
Olá!

Veja este tópico.
Olá,

Eu já havia visto esse tópico, mas confesso que não entendi nada.

Pelo exemplo que consta no post, o mesmo carrega um arquivo texto e em seguida me parece que envia para a impressora. Não é bem o meu caso!

No meu caso são vários relatórios, todos formatados para impressão em impressora matricial. Vou ter que reescreve-los? Se sim, ficará inviável! Listar as impressoras e selecionar as mesmas que estão instaladas no Windows já entendi. A saída do relatório é que ainda não entendi, ou seja, como substituo o SET PRINTER TO tanto para Windows como para o Linux?

Grato pela sua atenção.

Converter de Clipper para Harbour - Parte II

Enviado: 04 Mar 2015 13:20
por alxsts
Olá!

É só adaptar na hora de enviar para a impressora. A criação do arquivo de impressão continua do jeito que você já faz.

Código: Selecionar todos

   // This example sends printer output to a text file, overwriting
   // an existing file with the same name:

   SET PRINTER TO Prnfile.txt
   SET DEVICE TO PRINTER
   SET PRINTER ON
   //
   // Colocar o código de geração do relatório aqui...
   @ 0, 0 SAY "This goes to Prnfile.txt"
   ? "So will this!"
   //
   SET DEVICE TO SCREEN
   SET PRINTER OFF
   SET PRINTER TO            // Close the print file

   PrintWinPrn( "Prnfile.txt" )

*********************************
FUNCTION PrintWinPrn(cArq,cPrint)
*********************************
*
*
   Local oPrn, aPrn:=WIN_PRINTERLIST(), n := 0
   Local cText, nLinh, n

   if empty(aPrn)
      Alert('Não há impressoras instaladas')
      return .f.
   endif
   If cPrint == Nil
    cPrint := win_PrinterGetDefault()
   EndIf

   oPrn := win_prn():New(cPrint)
   oPrn : LandScape := .f.
   oPrn : FormType  := FORM_A4
   oPrn : Copies    :=  1
   oPrn : CharSet(255)
   oPrn : setfont('Courier New',,10,,,,255)

   If !oPrn:Create()
      Alert("Não foi criado documento")
      Return Nil
   EndIf
   If !oPrn:startDoc("Imprimindo Documento")
      hwg_Msginfo("Erro na Impressora")
      Return Nil
   EndIf

   HB_CDPSelect("PT850")
     cText := memoread(cArq)
     nLinh := mlcount(cText)
     oPrn:NewLine()
     oPrn:NewLine()
     For n := 1 to nLinh
        oPrn:Textout(WIN_ansitooem(memoline(cText,,n)),.t.)
     Next
     oPrn:EndDoc()

   HB_CDPSelect( "PTISO")

   Return .t.
//-----------------------------------------------------------------------
Veja se funciona com matricial.

Converter de Clipper para Harbour - Parte II

Enviado: 04 Mar 2015 19:29
por aprendiz_ce
alxsts escreveu:Olá!

É só adaptar na hora de enviar para a impressora. A criação do arquivo de impressão continua do jeito que você já faz.

Código: Selecionar todos

   // This example sends printer output to a text file, overwriting
   // an existing file with the same name:

   SET PRINTER TO Prnfile.txt
   SET DEVICE TO PRINTER
   SET PRINTER ON
   //
   // Colocar o código de geração do relatório aqui...
   @ 0, 0 SAY "This goes to Prnfile.txt"
   ? "So will this!"
   //
   SET DEVICE TO SCREEN
   SET PRINTER OFF
   SET PRINTER TO            // Close the print file

   PrintWinPrn( "Prnfile.txt" )

*********************************
FUNCTION PrintWinPrn(cArq,cPrint)
*********************************
*
*
   Local oPrn, aPrn:=WIN_PRINTERLIST(), n := 0
   Local cText, nLinh, n

   if empty(aPrn)
      Alert('Não há impressoras instaladas')
      return .f.
   endif
   If cPrint == Nil
    cPrint := win_PrinterGetDefault()
   EndIf

   oPrn := win_prn():New(cPrint)
   oPrn : LandScape := .f.
   oPrn : FormType  := FORM_A4
   oPrn : Copies    :=  1
   oPrn : CharSet(255)
   oPrn : setfont('Courier New',,10,,,,255)

   If !oPrn:Create()
      Alert("Não foi criado documento")
      Return Nil
   EndIf
   If !oPrn:startDoc("Imprimindo Documento")
      hwg_Msginfo("Erro na Impressora")
      Return Nil
   EndIf

   HB_CDPSelect("PT850")
     cText := memoread(cArq)
     nLinh := mlcount(cText)
     oPrn:NewLine()
     oPrn:NewLine()
     For n := 1 to nLinh
        oPrn:Textout(WIN_ansitooem(memoline(cText,,n)),.t.)
     Next
     oPrn:EndDoc()

   HB_CDPSelect( "PTISO")

   Return .t.
//-----------------------------------------------------------------------
Veja se funciona com matricial.
alxsts,

Eu sempre enviei direto para a impressora. Tipo: Set Printer To LPT1. Só envio para arquivo quando quero que o usuário visualize em tela.

Quer dizer que com Harbour eu sempre tenho que criar o relatório em um arquivo texto e depois é que mando para a impressora, é isso?! Se sim, então no Linux é da mesma forma?

Grato e aguardo pelo seu comentário.

Converter de Clipper para Harbour - Parte II

Enviado: 04 Mar 2015 20:02
por alxsts
Olá!

É aquela velha história: se não quiser ou não puder mudar, continue como está. O Harbour é compatível com Clipper neste ponto, tanto no Windows, quanto no Linux.

Mas, é altamente recomendável fazer uma modernização nos teus processos. Já faz bastante tempo que é padrão criar um arquivo de impressão, exibi-lo na tela e permitir ao usuário imprimi-lo ou salvá-lo em alguns formatos, como texto ou PDF. Dependendo do arquivo, é indicado também exportar para Excel.

Converter de Clipper para Harbour - Parte II

Enviado: 05 Mar 2015 12:28
por aprendiz_ce
alxsts escreveu:Olá!

É aquela velha história: se não quiser ou não puder mudar, continue como está. O Harbour é compatível com Clipper neste ponto, tanto no Windows, quanto no Linux.

Mas, é altamente recomendável fazer uma modernização nos teus processos. Já faz bastante tempo que é padrão criar um arquivo de impressão, exibi-lo na tela e permitir ao usuário imprimi-lo ou salvá-lo em alguns formatos, como texto ou PDF. Dependendo do arquivo, é indicado também exportar para Excel.
Olá alxsts, Bom Dia!

Só pra não restar dúvidas: Então o padrão atualmente é criar o arquivo (texto) e depois envia-lo para a impressora?

O meu problema é aproveitar o relatórios que tenho hoje, pois são vários e sem falar que são bastantes específicos e complexos, daí só quero "moderniza-los" em um segundo momento. O que necessito com uma certa URGÊNCIA é a criação de meia dúzia de relatórios em PDF. Como fica essa questão? O próprio Harbour já tem suporte para isso ou vou ter que utilizar algum tipo LIB? VI aqui no fórum em alguns posts antigos, que o pessoal tinha que utilizar umas "coisinhas" extras.

Mais uma vez obrigado pela sua atenção e aguardo pelo seu comentário.

Converter de Clipper para Harbour - Parte II

Enviado: 05 Mar 2015 13:47
por MSDN
Boa tarde,

Para fazer o que deseja, imprimir direto sem gerar arquivo texto, use essa rotina, a única diferença que vai ter, é que será montado um menu com todas as impressoras instaladas no seu Windows para escolher, depois que escolher com ENTER, tudo vai ser direcionado para essa impressora, abaixo o código :

1- Exemplo de um PRG que vai imprimir algo, no momento onde o usuário escolhe período (exemplo nesse caso), etc

Código: Selecionar todos

While .T.

      SetColor(Cor18)

      @ 09, 17 Say 'Visualizar :'
      @ 10, 17 Say 'Periodo    :' Get dInicio Valid .Not. Empty(dInicio)
      @ 10, 44                    Get dFinal Valid dFinal >= dInicio
      @ 11, 17 Say 'Confirma   :'
      @ 12, 17 Say 'Mensagem   :'
      Read

      If LastKey() == 27
	  	 Close All
	 	 Seta_On()
	 	 RestScreen(,,,,Tela)
	 	 SetColor(Cor)
	 	 Return(Nil)
      Endif

      SetColor("n+/w,gr+/b")
      @ 09, 31 Prompt 'em TELA'
      @ 09, 40 Prompt 'na IMPRESSORA'
      Menu To nOp_Vis
      
      Do Case
	  	 Case nOp_Vis == 0
	      	  Close All
	      	  Seta_On()
	      	  RestScreen(,,,,Tela)
	      	  SetColor(Cor)
	      	  Return(Nil)
	     Case nOp_Vis == 2
	          EscolheImp()
      EndCase

      SetColor("n+/w,gr+/b")
      @ 11, 31 Prompt 'Sim, imprimir'
      @ 11, 45 Prompt 'NÆo, voltar'
      Menu To nOp_ok
      
      Do Case
	  	 Case nOp_ok == 0 .Or. nOp_ok == 2
	      	  Close All
	      	  Seta_On()
	      	  RestScreen(,,,,Tela)
	      	  SetColor(Cor)
	      	  Return(Nil)
      EndCase

      Exit

End
2- Como chamar a função que direciona para as impressoras

Código: Selecionar todos

If nOp_Vis == 1
   cAplicativo := 'notepad.exe'
   Set Printer To c:\RELAT.TXT
   Set Device To Print
   Set Console Off
Else
   Set Printer To (aPrinter[nOpPrinter])
   Set Device To Print
   Set Console Off
   Set Printer On
   @ 00, 00 Say Chr(027)+Chr(040)+Chr(115)+Chr(049)+Chr(054)+Chr(054)+Chr(048)+Chr(050)+Chr(084) //arial
   @ 00, 00 Say Chr(027)+Chr(038)+Chr(108)+Chr(050)+Chr(054)+Chr(065) //A4
   @ 00, 00 Say Chr(027)+Chr(040)+Chr(115)+"15"+Chr(072)
Endif
...depois continua com o seu código fonte para imprimir o relatório.

3- A função que vai mostrar as impressoras

Código: Selecionar todos

Function EscolheImp()

	 Local nX   := 0
	 Local Cor  := SetColor()
	 Local Tela := SaveScreen()

	 aPrinter := GetPrinters()

	 SetColor('w+/r')
	 @ 00, 40 Clear To 00, 80
	 @ 00, 41 Say 'Escolha a impressora :'
	 SetColor('w/b*,n/gr*')
	 @ 01, 40 Clear To Len(aPrinter)+2, 80

	 While .T.
	       For nX := 1 To Len(aPrinter)
		   @ 01+nX, 41 Prompt aPrinter[nX]
	       Next nX
	       Menu To nOpPrinter
	       Do Case
		  Case nOpPrinter == 0
		       Alert('Primeiro escolha uma impressora')
		       Loop
		  Otherwise
		       Exit
	       EndCase
	 End

	 SetColor(Cor)

	 Return(Nil)
Se vc usa o xHarbour, compila normalmente, se usa o Harbour, basta incluir a lib xhb.

Abraços

Converter de Clipper para Harbour - Parte II

Enviado: 05 Mar 2015 14:44
por alxsts
Olá!

Quanto à questão da geração de documentos em PDF, sugiro que leia o tópico Passando pra Harupdf em etapas, onde existem alguns exemplos.

Converter de Clipper para Harbour - Parte II

Enviado: 05 Mar 2015 16:06
por aprendiz_ce
Olá MSDN,

Penso que com o seu exemplo vou deixar a "coisa" bem profissional.

Muito obrigado pela sua atenção.

Converter de Clipper para Harbour - Parte II

Enviado: 05 Mar 2015 16:08
por aprendiz_ce
Olá alxsts,

Vou dar uma olhada no tópico recomendado por você.


Mais uma vez obrigado pela sua pronta atenção.

Converter de Clipper para Harbour - Parte II

Enviado: 09 Mar 2015 12:12
por aprendiz_ce
Prezados,

Por que ao tentar imprimir em uma impressora de rede (compartilhada) a rotina me retorna o seguinte erro:
"Error TERM/2014 Create error: \\SERVER\FX2180 (DOS Error 53)"? Se eu utilizar um bloco de notas ou qualquer outra coisa imprime normalmente. Fiz o teste seguindo o exemplo postado aqui.

Grato.

Converter de Clipper para Harbour - Parte II

Enviado: 18 Abr 2015 12:32
por burel
Bom dia pessoal, estou com um problema de troca de caracteres no ato da impressão.

O caractere que saia no Clipper, está saindo diferente no xHarbour.

O que no Clipper sai uma linha continua , no windows está saindo a letra "Ä" , como abaixo :
ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´


O que meu programa faz?
Cria um arquivo texto com os dados e salvo em TMP_CONS.TXT. Quanto do prompt do DOS, digito "type TMP_CONS.TXT", os carecteres estão corretos
porém quando abro o mesmo arquivo e imprimo com a classe Win32Prn ou mesmo com o Bloco de Notas, os caracteres saem trocados.

Alguém pode me ajudar?
Agradeço a atenção,
Abraço,
Eduardo

Converter de Clipper para Harbour - Parte II

Enviado: 18 Abr 2015 14:39
por Itamar M. Lins Jr.
os carecteres estão corretos
porém quando abro o mesmo arquivo e imprimo com a classe Win32Prn ou mesmo com o Bloco de Notas, os caracteres saem trocados.
No notepad troque a fonte para Courier New ou Terminal.

É um problema com a fonte.
No Clipper ou Harbour é o mesmo problema.

Mude a pagina de código antes de imprimir.
HB_CDPSelect("PT850")

Código: Selecionar todos

*********************************
Function PrintWinPrn(cArq,cPrint)
*********************************
*
*
Local oPrn, aPrn:=WIN_PRINTERLIST(), n := 0
if empty(aPrn)
   hwg_Msginfo('Não há impressoras instaladas')
   return .f.
endif
If cPrint == Nil
 cPrint := win_PrinterGetDefault()
EndIf

oPrn := win_prn():New(cPrint)
oPrn : LandScape := .F.
oPrn : FormType  := WIN_DMPAPER_A4 
oPrn : Copies    :=  1
oPrn : CharSet(255)
oPrn : setfont('Courier New',,10,,,,255)

If !oPrn:Create()
   hwg_Msginfo("Não foi criado documento")
   Return Nil
EndIf
If !oPrn:startDoc("Imprimindo Documento")
   hwg_Msginfo("Erro na Impressora")
   Return Nil
EndIf

HB_CDPSelect("PT850")
  //setprc(7,0)
  cText := memoread(cArq)
  nLinh := mlcount(cText)
  oPrn:NewLine()
  oPrn:NewLine()
  For n := 1 to nLinh
     oPrn:Textout(WIN_ansitooem(memoline(cText,,n)),.t.)
  Next
  oPrn:EndDoc()

HB_CDPSelect( "PTISO")

Return .t.
Saudações,
Itamar M. Lins Jr.

Converter de Clipper para Harbour - Parte II

Enviado: 20 Abr 2015 10:58
por burel
Agradeço a atenção Itamar, mas infelizmente não funcionou,

O arquivo gerado original, quanto digito no prompt do DOS "type arquivo gerado.txt" os caracteres saem corretos, porém, quando abro via Bloco de Notas e altero a fonte, conforme você me orientou para Currier New, os carácteres "estranhos" continuam, como abaixo. Abaixo deste arquivo estou incluindo a função com a inclusão do HB_CDPSelect("PT850"). Muito obrigado pela atenção Itamar. Abraço



³ P E D I D O ³ ³ Paciente..: BERNARDO
Hospital..: HOSP 309
³ 177399 ³ ³ Idade.....: 2 anos 2 meses 21 dias Sexo: M ³
³ 13/01/2015 ³ ³ Peso Atual: 0,000 Kg Peso Teorico: 12,000 Kg ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ GASTO ENERGETICO DIARIO(estimado) NUTRICAO ENTERAL ³
³ FAIXA -> 1018 Ä 1113 KCal VCT : 94 KCal ³
³ Ptna : 3,54 g 14,69 % ³
³ Lip¡dio : 4,72 g 43,58 % ³
³ HC : 10,17 g 41,73 % ³
ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
³ Volume [ 123.0] ml - Dieta B sica:ALFARE ³
³ Dietas: ALFARE 19,68 g ³
³ ³
³ Aditivos: ³
³ ³
³ ³
³ ³
³ ³
³ ³
ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
³ ELEMENTO ³ NECESSIDADES DIARIAS ³ DIETA ENTERAL ³
³ ³ RDA 89 ³ PRESCRITA ³
³ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͳÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͳÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͳ
³ ³ ³ ³
³ Ca (mg/mEq) ³ 800/ 40,0 ³ 0/ 0,0 ³
³ P (mg/mEq) ³ 800/ 16,7 ³ 49/ 1,0 ³
³ Na (mg/mEq) ³ 325/ 14,1 Ä 975/ 42,4 ³ 57/ 2,5 ³
³ K (mg/mEq) ³ 550/ 14,1 Ä 1650/ 42,2 ³ 118/ 3,0 ³
³ Cl (mg/mEq) ³ 500/ 14,1 Ä 1500/ 42,3 ³ 98/ 2,8 ³
³ Mg (mg/mEq) ³ 150/ 12,3 ³ 12/ 0,98 ³
³ Fe (mg) ³ 15 ³ 1 ³
³ Zn (æg) ³ 10000 ³ 707,8 ³
³ I (æg) ³ 70 ³ 5 ³
³ Cu (æg) ³ 1000,0 Ä 1500,0 ³ 52,43 ³
³ Mn (æg) ³ 1000,0 Ä 1500,0 ³ 6,57 ³
³ F (mg) ³ 0,50 Ä 1,50 ³ 0,00 ³
³ Cr (æg) ³ 20,00 Ä 80,00 ³ 0,00 ³
³ Se (æg) ³ 20,0 Ä 80,0 ³ 0,0 ³
³ Mo (æg) ³ 50,0 Ä 100,0 ³ 0,0 ³
³ Vitamina A (UI) ³ 1333 ³ 283 ³
³ Vitamina D (UI) ³ 400 ³ 56 ³
³ Vitamina E (UI) ³ 7,45 ³ 1,18 ³
³ Vitamina K (æg) ³ 15 Ä 30 ³ 8 ³
³ Vitamina C (mg) ³ 45 ³ 7 ³
³ Tiamina Ä B1 (mg) ³ 0,7 ³ 0,1 ³
³ Riboflavina Ä B2 (mg) ³ 0,80 ³ 0,13 ³
³ Piridoxina Ä B6 (mg) ³ 0,90 ³ 0,06 ³
³ Niacina - PP - B3(mg) ³ 9 ³ 1 ³
³ Ac. Folico (æg) ³ 100 ³ 8 ³
³ Cobalamina Ä B12 (æg) ³ 2,0000 ³ 0,2096 ³
³ Biotina (æg) ³ 65 ³ 2 ³
³ Ac. Pantotenico (mg) ³ 3 ³ 0 ³
ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
³ OUTROS ELEMENTOS CONTIDOS NA DIETA PRESCRITA ³
³ Glutamina : 0,000 g Fibra : 0,000 g ³
³ Taurina : 0,000 g Colina : 7,085 mg ³
³ Carnitina : 0,000 g Inositol : 4,192 mg ³
³ Arginina : 0,0000 g Biotina : 2,096 mg ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ


* INICIO DO FONTE QUE IMPRIME EM WINDOWS


#include "WinGdi.ch"

// Função que imprime o arquivos ArqTxt já salvo em disco para impressora em windows.

Function ImpArq(ArqTxt,inPrnDefault,inTipoImpressao)
Local cPrinter
Local contl := 1
Private PrnDefault

cFileName := ArqTxt

cTipoImpressao := 1 // 1 = normal 2 = Comprimido
If inTipoImpressao = Nil
cTipoImpressao := 2
Else
cTipoImpressao := inTipoImpressao
Endif


If inPrnDefault = nil
PrnDefault := .f.
Else
PrnDefault := .t.
Endif





If !File( cFileName )
Return Nil
Else // Vamos colocar seu arquivo num Array

cLinha := Nil
aLinesPrint := {}
cBuffer := FOpen( cFileName, 2 )

Do While Hb_FReadLine( cBuffer, @cLinha, Nil, 255 ) = 0
AaDd( aLinesPrint, cLinha )
EndDo

FClose( cBuffer )

EndIf

cPrinter := PegaPrinter() // escolhe a impressora
If !Empty( cPrinter )

nCopias := 1 // n£mero de c¢pias

oPrinter := Win32Prn():new( cPrinter )
oPrinter:landscape := .F.
oPrinter:formType := DMPAPER_A4 // folha A4
oPrinter:copies := nCopias

IF .NOT. oPrinter:create()
Alert("Erro Tentando Acessar a Impressora")
Return Nil
ENDIF

IF .NOT. oPrinter:startDoc( "Impressao Teste" )
Alert("Erro Tentando Enviar os Dados de Impressao")
Return Nil
ENDIF


IF cTipoImpressao = 2 // impressao comprimida

// impressao comprimida: { 3, -50 } ‚ igual 50/3, ou seja 16.6 cpp

// oPrinter:SetFont( "Lucida Console", 10, { 3, -50 } )

oPrinter:SetFont( "Courier New", 10, { 3, -50 } ) // Letra Default do DOS -> Courier New


Else // impressao normal

// oPrinter:SetFont( "Lucida Console", 10 )

oPrinter:SetFont( "Courier New", 10 ) // Letra Default do DOS -> Courier New

oPrinter:CharSet( 0 )
oPrinter:bold( FW_NORMAL ) // nao negrito, nao it lico, etc...

Endif

oPrinter:leftMargin(130) // Posiciona Margem da folha.

// Imprimir arquivo Texto enviado via parametro para a funcão impArq().


HB_CDPSelect("PT850") <-------- INCLUSAO SUGERIDA

For i = 1 To Len ( aLinesPrint )
oPrinter:textOut( alltrim(aLinesPrint[ i ]) ) // imprime a linha
oPrinter:newLine() // passa para proxima linha
Next



oPrinter:endDoc() // envia a impressora
oPrinter:destroy() // fecha documento de impressao

ERASE &cFileName // apaga arquivo criado para impressao. 21-08-2014

EndIf

// EndIf // Imprime relatório?

Return Nil

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

Function PegaPrinter() // seleciona impressora
Local i, nPrn := 1, oPrn, nMaxLen := 0, aPNomes := {}
Local cPrinter := "", aPrn := GetPrinters( .t. )
Local cPrinDefault := GetDefaultPrinter()

If Empty( aPrn )
Alert( "Nenhuma impressora Instalada" )
Return ( cPrinter )
Endif


For i=1 To Len( aPrn )
AaDd( aPNomes , aPrn[i,1] )
nPrn := If( aPrn[i,1] = cPrinDefault, i, nPrn )
nMaxLen := If( Len( aPrn[i,1] ) > nMaxLen, Len( aPrn[i,1] ), nMaxLen )
Next

If PrnDefault
Return ( cPrinDefault ) // teste para impressão de folhas seguidas
Endif

nCor := SetColor()

Set color to
Clear Screen
Set curs On

nPrn := AChoice( 3, 10, Len( aPNomes )+3, nMaxLen+10, aPNomes, .T., Nil , nPrn )

SetColor(nCor)

If nPrn = 0
Return ( cPrinter )
EndIF

cPrinter := Alltrim( aPNomes[nPrn] )
Return ( cPrinter )