Página 1 de 1
Padronizar impressoes/Impressoras
Enviado: 30 Mai 2006 11:21
por marcos.gurupi
Caros, depois q mudei para o xharbour estou enfrentando outra dificuldade, na verdade 90% estah funcionando melhor q o antigo clipper, mas ocorre q como alguns micros tem 98 e outros o XP fica dificil padrozinar impressoes, ou seja, tem micros com imp. USB outros com lx-300 e outras laser, quando alguem tem q imprimir um relatorio e um deus nos acuda. No meu sistema a principio fiz da seguinte maneira: para cada terminal tem um arq. dbf com 3 variaveis destida a portas
imp01:="Formulario Branco"
por01:="lpt1"
imp02:="Bolheto Bancaria"
por02:="lpt2"
imp03:="Notas Fiscais"
por03:="lpt3"
Mas mesmo assim quando alguem vai imprimir por exemplo uma sugestaum de compra na Jato de tinta eu atualmente n tenho como configurar e mesmo direcionar para a jato de tinta. Como poderia fazer para mudar essa situacao?
Marcos Roberto
Enviado: 30 Mai 2006 11:48
por MARCELOG
Oi Marcos, beleza!
Verificando o seu problema, talvez seja o caso de você realmente padronizar seus relatórios.
Pense na viabilidade de direcionar a saída para um arquivo temporário e/ou array e depois, imprimir este arquivo ou array.
Veja a classe win32prn.
Com ela você verifica a impressora e "automaticamente" tem o número de linhas e coluna que ela suporta por página, o tamanho do papel, etc., pouco importando se ela é lpt ou usb.
Dessa forma, com algum esforço, e respeitada o papel configurado na impressora, seu relatório não sofrerá grandes alterações em qualquer equipamento escolhido.
Trocando em miúdos (só uma sugestão).
Use getprinters() para pegar as impressoras instaladas e, nas suas variáveis, use/guarde o nome dessas impressoras (igual instalado), conforme seleção.
Obviamente, você criou essa situação em seu sistema.
Após, com o uso da classe win32prn, elabore o relatório com base na configuração da impressora escolhida.
Atenção, se o "filho da mãe" do usuário mudar o nome da impressora instalada originalmente, vai haver erro na criação do documento.
Assim, por precaução, crie uma rotina que, antes de criar o documento, verifique a impressora escolhida ainda tem o mesmo nome perante o windows.
Simples exemplo para obter a impressora para boleto :
local aImpressora=getprinters()
local cImpressoraBoleto
@ 10,10,20,40 get cImpressoraBoleto LISTBOX aImpressora CAPTION "Boleto"
READ
Espero ter ajudado.
MarceloG
O conhecimento humano pertence à humanidade.
Enviado: 30 Mai 2006 12:57
por marcos.gurupi
Ajudou sim caro Marcelo, inclusive eu jah havia abordado essa situacao em outra ocasiao e vc postou algo nesse sentido (usando win32prn), acontece q como estou praticamente sozinho aqui (tocantins) n tem ninguem usando xharbour e muito menos essa classe (win32...), sei q eh uma classe poderosa mas n sei como usa-la por falta de documentacao. Peguem um exemplo dela (win32prn) mas n eh um baita exemplo eh o trivial. Mas obrigado e espero q o post seja bem explorado para a melhoria d todos.
Marcos Roberto.
Enviado: 31 Mai 2006 08:32
por MARCELOG
Caro Marcos,
eu estou em Divinópolis/MG, e quase tudo que eu sei sobre clipper e xharbour, aprendi com dois livros velhos sobre clipper e nos sites da vida.
Tocatins é um estado novo, mas não está isolado do mundo.
Vamos lá, encare a marcação.
Todo mundo já criou o "Hello Word", que nada mais é que o velho "Alo Mundo" brasileiro, uai!
Vou ver se preparo algo para te ajudar e colocar neste tópico.
É importante destacar que os esilos de programação, e cada um tem um, pode variar e criar certa de dificuldade.
MarceloG
Enviado: 31 Mai 2006 09:17
por marcos.gurupi
Acho q fui mal interpretado, n quiz dizer q meu estado eh isolado do mundo mas q aqui todos os programadores em clipper ainda estaum no clipper, eu jah sentia q o compilador clipper n satisfazia minhas nessecidades e d meus clientes, por isso embarquei no xharbour e suas libs, acontece minhas dificuldades saum as mesmas d vcs ai (falta de documentacaum) mas vcs trocam ideias entre vcs ai, ou seja, vcs estaum mais perto da "muvuca". N quero entrar na polemica, mas por exemplo c eu for atras da classe win32prn na internet n encontro muita coisa, digo pq jah fiz isso.
Gostaria q alguem q tivesse um bom exemplo dessa classe postasse aqui pra q todos ultilizasse.
Obrigado.
Marcos Roberto
Enviado: 31 Mai 2006 12:57
por MARCELOG
Marcos, estamos tão perto da muvuca, como estamos tão perto do teclado.
A tecnologia une mentes, desejos e corações (tô inspirado não!).
Este é o arquibo testw32p.prg que vem no pacote de testes do xharbour.
Compile e link o mesmo, verificando o que acontece.
Mais tarde, Vou fazer alguns comentários e, se estiver errado, corrijam-me.
Código: Selecionar todos
#define FORM_A4 9
#define PS_SOLID 0
#define RGB( nR,nG,nB ) ( nR + ( nG * 256 ) + ( nB * 256 * 256 ) )
#define BLACK RGB( 0x0 ,0x0 ,0x0 )
#define BLUE RGB( 0x0 ,0x0 ,0x85 )
#define GREEN RGB( 0x0 ,0x85,0x0 )
#define CYAN RGB( 0x0 ,0x85,0x85 )
#define RED RGB( 0x85,0x0 ,0x0 )
#define MAGENTA RGB( 0x85,0x0 ,0x85 )
#define BROWN RGB( 0x85,0x85,0x0 )
#define WHITE RGB( 0xC6,0xC6,0xC6 )
FUNCTION Main()
LOCAL nPrn:=1, cBMPFile:= SPACE( 40 )
LOCAL aPrn:= GetPrinters()
LOCAL GetList:= {}
CLS
IF EMPTY(aPrn)
Alert("No printers installed - Cannot continue")
QUIT
ENDIF
DO WHILE !EMPTY(nPrn)
CLS
@ 0,0 SAY 'Win32Prn() Class test program. Choose a printer to test'
@ 1,0 SAY 'Bitmap file name' GET cBMPFile PICT '@!K'
READ
@ 2,0 TO maxRow(),maxCol()
nPrn:= ACHOICE(3,1,maxRow()-1,maxCol()-1,aPrn,.T.,,nPrn)
IF !EMPTY(nPrn)
PrnTest(aPrn[nPrn], cBMPFile)
ENDIF
ENDDO
RETURN(NIL)
STATIC FUNCTION PrnTest(cPrinter, cBMPFile)
LOCAL oPrinter:= Win32Prn():New(cPrinter), aFonts, x, nColFixed, nColTTF, nColCharSet
oPrinter:Landscape:= .F.
oPrinter:FormType := FORM_A4
oPrinter:Copies := 1
IF !oPrinter:Create()
Alert("Cannot Create Printer")
ELSE
IF !oPrinter:startDoc('Win32Prn(Doc name in Printer Properties)')
Alert("StartDoc() failed")
ELSE
oPrinter:SetPen(PS_SOLID, 1, RED)
oPrinter:Bold(800)
oPrinter:TextOut(oPrinter:PrinterName+': MaxRow() = '+STR(oPrinter:MaxRow(),4)+' MaxCol() = '+STR(oPrinter:MaxCol(),4))
oPrinter:Bold(0) // Normal
oPrinter:NewLine()
oPrinter:TextOut(' Partial list of available fonts that are available for OEM_')
oPrinter:NewLine()
oPrinter:UnderLine(.T.)
oPrinter:Italic(.T.)
// oPrinter:SetFont('Courier New',7,{3,-50}) // Compressed print
nColFixed:= 40 * oPrinter:CharWidth
nColTTF := 48 * oPrinter:CharWidth
nColCharSet := 60 * oPrinter:CharWidth
oPrinter:TextOut('FontName')
oPrinter:SetPos(nColFixed)
oPrinter:TextOut('Fixed?')
oPrinter:SetPos(nColTTF)
oPrinter:TextOut('TrueType?')
oPrinter:SetPos(nColCharset)
oPrinter:TextOut('CharSet#',.T.)
oPrinter:NewLine()
oPrinter:Italic(.F.)
oPrinter:UnderLine(.F.)
aFonts:= oPrinter:GetFonts()
oPrinter:NewLine()
FOR x:= 1 TO LEN(aFonts) STEP 2
oPrinter:CharSet(aFonts[x,4])
IF oPrinter:SetFont(aFonts[x,1]) // Could use "IF oPrinter:SetFontOk" after call to oPrinter:SetFont()
IF oPrinter:FontName == aFonts[x,1] // Make sure Windows didn't pick a different font
oPrinter:TextOut(aFonts[x,1])
oPrinter:SetPos(nColFixed)
oPrinter:TextOut(IIF(aFonts[x,2],'Yes','No'))
oPrinter:SetPos(nColTTF)
oPrinter:TextOut(IIF(aFonts[x,3],'Yes','No'))
oPrinter:SetPos(nColCharSet)
oPrinter:TextOut(STR(aFonts[x,4],5))
oPrinter:SetPos(oPrinter:LeftMargin, oPrinter:PosY + (oPrinter:CharHeight*2))
IF oPrinter:PRow() > oPrinter:MaxRow() - 10 // Could use "oPrinter:NewPage()" to start a new page
EXIT
ENDIF
ENDIF
ENDIF
oPrinter:Line(0, oPrinter:PosY+5, 2000, oPrinter:PosY+5)
NEXT x
oPrinter:SetFont('Lucida Console',8,{3,-50}) // Alternative Compressed print
oPrinter:CharSet(0) // Reset default charset
oPrinter:Bold(800)
oPrinter:NewLine()
oPrinter:TextOut('This is on line'+STR(oPrinter:Prow(),4)+', Printed bold, ' )
oPrinter:TextOut(' finishing at Column: ')
oPrinter:TextOut(STR(oPrinter:Pcol(),4))
oPrinter:SetPrc(oPrinter:Prow()+3, 0)
oPrinter:Bold(0)
oPrinter:TextOut("Notice: UNDERLINE only prints correctly if there is a blank line after",.T.)
oPrinter:TextOut(" it. This is because of ::LineHeight and the next line",.T.)
oPrinter:TextOut(" printing over top of the underline. To avoid this happening",.T.)
oPrinter:TextOut(" you can to alter ::LineHeight or use a smaller font")
oPrinter:NewLine()
oPrinter:NewLine()
oPrinter:SetFont('Lucida Console',18, 0) // Large print
oPrinter:SetColor( GREEN )
oPrinter:TextOut("Finally some larger print")
oPrinter:Box( 0, oPrinter:PosY+100, 100, oPrinter:PosY+200)
oPrinter:Arc(200, oPrinter:PosY+100, 300, oPrinter:PosY+200)
oPrinter:Ellipse(400, oPrinter:PosY+100, 500, oPrinter:PosY+200)
oPrinter:FillRect(600, oPrinter:PosY+100, 700, oPrinter:PosY+200, RED)
// To print a barcode;
// Replace 'BCod39HN' with your own bar code font or any other font
// oPrinter:TextAtFont( oPrinter:MM_TO_POSX( 30 ) , oPrinter:MM_TO_POSY(60 ), '1234567890', 'BCod39HN', 24, 0 )
//
PrintBitMap( oPrinter, cBMPFile )
oPrinter:EndDoc()
ENDIF
oPrinter:Destroy()
ENDIF
RETURN(NIL)
procedure PrintBitMap( oPrn, cBitFile )
LOCAL oBMP
IF EMPTY( cBitFile )
*
ELSEIF !FILE( cBitFile )
Alert( cBitFile + ' not found ' )
ELSE
oBMP:= Win32BMP():new()
IF oBmp:loadFile( cBitFile )
oBmp:Draw( oPrn, { 200,200, 2000, 1500 } )
// Note: Can also use this method to print bitmap
// oBmp:Rect:= { 200,2000, 2000, 1500 }
// oPrn:DrawBitMap( oBmp )
ENDIF
oBMP:Destroy()
ENDIF
RETURN
o arquivo testw32p.prg (ou algo assim que vem no pacote do xharbour apresenta todos os recursos da classe.
Enviado: 31 Mai 2006 14:25
por kiko
oi
o exemplo q o marcelog deu ainda a pouco eh mto util...da pra ver mta coisa nele...
tem tb o site do xHarbour, eu encontrei uma documentacao basica dessa classe...
http://www.xharbour.com/xhdn/index.asp? ... show_sub=2
ate a proxima
Enviado: 31 Mai 2006 15:14
por marcos.gurupi
Agradeco ao Marcelo (acredito q em nome d todos) o exemplo especifico, estarei testando e aplicando as necessidades e posteriormente vou postar o resultado.
Obrigado.
Marcos Roberto
Enviado: 02 Jun 2006 14:28
por marcos.gurupi
Estou testanto o win32prn() e realmente eh uma ferramenta fora d serie, mas estou tento dificuldade para escolher a fonte necessaria para o relatorio. Tipo:
Quando quero condensar uso qual comando ou quando quero expandir q comando usar.
Obrigado.
Marcos Roberto.
Enviado: 02 Jun 2006 15:39
por MARCELOG
Caro Marcos,
a função/método setfont define a fonte e tamanho.
No exemplo, ative essa linha e veja:
// oPrinter:SetFont('Courier New',7,{3,-50}) // Compressed print
Agora, tudo que for impresso se dará com Courier New, tamanho 7.
Mude o 7 para 20, e o resultado será outro.
Se você tem o arquivo win32prn.prg dos sources, verifique o código fonte da função.
Tudo bem, tem muita coisa em "c"!!
Mas e daí, dá prá entender bastante coisa também.
Espero ter ajudado.
MarceloG
Ps: Embora você possa usar qualquer fonte, Use fontes que normalmente se encontram instaladas (Courier, Lucida, Times, etc.)
Não testei essa situação, mas se a fonte não tiver instalda no computador, a fonte padrão vai ser usada, ou seja, Courier New, tamanho 10.
Enviado: 02 Jun 2006 16:12
por marcos.gurupi
Caro marcelo, surgio uma outra questaum. Fiz a impressaum (com o exemplo q vc mandou) em uma hp 4100 multfuncional me parece q ele imprimi as fontes e tamanhos suportados pela impressora, pq imprimi tb em uma lx300 e o resultado foi diferente imprimindo as fontes q a lx300 suporta, entre elas a draft 10cpi, bom minha intencao e acho q muitos outros progradores eh q quando o usuario escolher a lx300 ou outra q suporta o draft (por ser mais rapido) o sistema jah configurar a impressaum texto (draft) e quando eu imprimir em uma 4100 por exemplo ele escolher as fontes couriew ou tahoma, ou seja, uma q tem instalada em todos micros. Como fazer para q o sistema saiba q o usuario estah imprimindo em uma matricial ou nao?
Marcos Roberto.
Enviado: 05 Jun 2006 13:03
por MARCELOG
Caro Marcos,
as fontes utilizáveis são aquelas instaladas no windows e, obviamente, suportadas pela impressora.
Se o windows não tem a fonte draft instalada ou a impressora não suporta a mesma, paciência (eu acho - vou verificar).
Eu faço assim:
Seleciono a impressora num listbox, conforme exemplo.
Pego as fontes disponíveis para essa impressora assim (tá no exemplo):
aFonts:= oPrinter:GetFonts()
Verifico, com Ascan(), se a fonte desejada está presente.
Procuro por draft, courier, arial, tahoma.
Se tiver a fonte procurada (ascan() vai retornar número diferente de 0), seguindo a ordem, tudo bem, é a que vai ser usada na criação do documento.
Todavia, se a fonte não existir, a fonte default será utilizada.
Você pode, se quiser, abrir outro listbox e/ou achoice e deixar que o usuário escolha a fonte também, definindo a que você "planejou" como padrão.
Veja as sinteses das funções ascan e achoice.
Também, você pode criar impressoras genéricas de texto e mandar ver a impressão do seu relatório. É um desperdício de codificação, mas tudo bem, vai ter a rapidez desejada.
Espero ter ajudado.
MarceloG