Bom dia lugab.
Analisei teu código somente na área de impressão e sua configuração.
Encontrei alguns erros básicos de conceito e de sintaxe. Vejamos por partes:
1-Não faz sentido você usar a classe Win32prn() para imprimir com impressoras matriciais. O resultado não fica bom além de ser extremamente lenta a impressão.
Você pode desenvolver uma rotina que verifique a impressora padrão. Se for matricial, imprima com o velho sistema @xx,yy SAy "", caso contrário use a classe Win32prn().
2-oPrinter:SetPrintQuality(2) // qualidade da impressao 1=rascunho 2=normal 3=media 4=melhor, -1=sugestão do fórum do Toledo
O parâmetro deve ser SEMPRE negativo, como:
-1 -Qualidade fotográfica;
-2 -Qualidade carta;
-3 -Qualidade média;
-4 -Qualidade rascunho.
3-oPrinter:SetFont('Courier New',,2,2)
Este comando não pode produzir bons resultados bons. O caracter fica todo deformado Veja que o parâmetro 3 está com o valor "2", ou seja, 2 CPI, o que é um caracter muito grande. Conceitualmente, 2 CPI pode ser impresso, desde que você tenha uma altura de caracter e altura de linha compatível.
Lembrar que você pode setar a altura da linha somente antes de criar o documento. Ela não poderá ser alterada no decorrer do documento. O mesmo acontece com o qualidade de impressão e com a orientação do documento.
A fonte poder ser alterada a qualquer momento.
Veja como se configura o setfont:
oPrinter:SetFont(cFontName, nPointSize, nWidth, nBold, lUnderline, lItalic, nCharSet)
oPrinter:SetFont('Courier New',12,{1,12}, 0, .F., .F.)
1-Nome da fonte;
2-Altura da fonte, em pixels;
3-Multiplicador da fonte (horizontal e vertical);
4-Largura da fonte - CPI (12 character per inch);
5-Controla o Negrito-Bold (700) ou normal (.F.);
6-Controla o sublinhado (.T.) ou não (.F.);
7-Controla o itálico (.T.) ou não (.F.).
4-Cuidado com o comprimento da linha. Todos os caracteres que ultrapassarem a largura útil do documento serão truncados.
A classe Win32prn() não gerencia o recurso de "nova linha" caso a linha seja muito comprida. Isto terá que ser feito via software. Lembre-se, a classe Win32prn() não é um editor de texto, que faz isto automaticamente.
5-Outro detalhe importante é em relação ao pitch dos caracteres para cada fonte usada. A grande maioria das fontes do windows são de pitch variável, ou seja, cada caracter possui uma largura diferente. O "i" ocupa menos espaço que o "m". Do meu conhecimento, somente as fontes "Courier" e "Courier New" são de pitch fixo.
6-O "teste4.prg" que estou anexando reproduz as configurações que você listou no teu tópico.
Todas elas funcionam perfeitamente. Os resultados, por vezes, são muito ruins. Veja os resultados de cada configuração.
Observe que os caracteres que ultrapassam a largura útil do documento são perdidos.
7-Muito bem. Faça as correções necessárias.
Se você tiver dificuldades, coloque um exemplo claro do que está acontecendo, e com isto facilitar a nossa ajuda. Uma descrição do tipo "o código não está funcionando" é de difícil análise visto que não temos conhecimento do que está sendo impresso.
Por último, meu amigo, o sucesso é feito de 99% de suor e 1% de sorte. Não desista...
A Classe Win32prn() é muito boa e 100% confiável. Não dá pau.
Bom trabalho.
Código: Selecionar todos
FUNCTION Main()
LOCAL nPrn:=1
LOCAL aPrn:= GetPrinters()
CLS
IF EMPTY(aPrn)
Alert("No printers installed - Cannot continue")
QUIT
ENDIF
DO WHILE !EMPTY(nPrn)
CLS
@ 0,0 SAY 'Programa de teste Classe WIN32PRN(). Escolha uma impressora. ESC' +;
' para sair.'
@ 1,0 TO maxRow(),maxCol()
nPrn:= ACHOICE(2,1,maxRow()-1,maxCol()-1,aPrn,.T.,,nPrn)
IF !EMPTY(nPrn)
PrnTest(aPrn[nPrn])
ENDIF
ENDDO
*
@ 22,00 say ""
RETURN(NIL)
*
*--------------------------------------------------------------------------------------------------
STATIC FUNCTION PrnTest(cPrinter)
LOCAL oPrinter:= Win32Prn():New(cPrinter), aFonts, x, nColFixed,nColTTF, nColCharSet
LOCAL ncarpol, i, nHandle, cString
Comprimi=.F. && (.T. se deseja fontes comprimidos) ou .f.
Paisagem=.T. && (.T.se deseja orientação Paisagem) ou .f.
oPrinter:FormType := 9
oPrinter:Copies := 1
oPrinter:SetPrintQuality(-2)
If Comprimi && ( letra comprimida e orientacao retrato NAÕ ESTÁ COMPRIMINDO NADA)
oPrinter:Landscape:= .F. && retrato
oPrinter:SetFont("Courier New",13,{3,-50},0,.F.,.F.) &&(NAO está Comprimindo)
Else
If Paisagem
oPrinter:SetFont('Courier New',,2,2)
oPrinter:Landscape:= .T. && Paisagem (Letras tão ultrapassando papel de 120 cols)
else
oPrinter:Landscape:= .F. && Retrato (Letras estão ultrapassando papel 80 cols)
Endif
Endif
Paisagem=.f.
Comprimi=.f.
c_arq := "Teste-" + LTRIM(STR(YEAR(DATE()))) + "-" + STRZERO(MONTH(DATE()),2) +;
"-" + LTRIM(STR(DAY(DATE()))) + "=" + TIME()
IF !oPrinter:Create()
Alert(" Impressora näo pode ser criada !!! ")
return
else
IF !oPrinter:startDoc("TPRINT("+c_arq+")")
Alert("StartDoc() Falha na Impressora !")
oPrinter:destroy()
return
endif
endif
// oPrinter:SetFont(cFontName, nPointSize, nWidth, nBold, lUnderline, lItalic, nCharSet)
// oPrinter:SetFont( 'Courier New',,2,2 )
// oPrinter:SetFont( 'Courier New',,12,,,,255 )
// oPrinter:SetFont( 'Courier New',13,{3,-50},0,.F.,.F. )
// oPrinter:SetFont( 'Courier New',12,{3,-55},700,.F.,.F. )
// oPrinter:SetFont( 'Courier New',8,{3,-60},700,.F.,.F. )
// oPrinter:SetFont( 'Arial Narrow',8,{3,-60},700,.F.,.F. )
// oPrinter:SetFont( 'Courier New',7,{0,15} )
// oPrinter:SetFont( 'Courier New',10,10 )
// oPrinter:SetFont( 'Courier New',7,14 )
// oPrinter:SetFont( 'Courier New',7,{0,18} )
// oPrinter:SetFont( 'Courier New',7,{3,-50} )
// oPrinter:SetFont( 'Courier New',7,{1,18} )
// oPrinter:SetFont( 'ARIAL',2,{1,18} )
cString := "1234567890abcdefghijklmnopqrstuvxyz-------50------" && cada sequencia tem 50 caracteres.
cString += "1234567890abcdefghijklmnopqrstuvxyz------100------"
cString += "1234567890abcdefghijklmnopqrstuvxyz------150------"
cString += "1234567890abcdefghijklmnopqrstuvxyz------200------"
cString += "1234567890abcdefghijklmnopqrstuvxyz------250------"
cString += "1234567890abcdefghijklmnopqrstuvxyz------300------"
cString += "1234567890abcdefghijklmnopqrstuvxyz------350------"
oPrinter:NewLine()
oPrinter:SetFont( 'Courier New',12,{3,-55},700,.F.,.F. )
oPrinter:NewLine()
oPrinter:TextOut( "Fonte: oPrinter:SetFont( 'Courier New',12,{3,-55},700,.F.,.F. )", .T.)
For lin = 1 TO 350
oPrinter:TextOut( Str(l1,03) + "-" + SUBS( cString, 1, lin ), .T. )
IF oPrinter:PRow() > oPrinter:MaxRow() - 2
oPrinter:NewPage()
oPrinter:NewLine()
ENDIF
Next lin
oPrinter:EndDoc()
oPrinter:Destroy()