IMPRESSAO COM O PRINTER?

TAMANINI 20/08/2007 14:36:25
#231669
Boa tarde, pessoal.

Estou modificando a impressão dos meus relatórios que eu fiz com o objeto printer e agora estou precisando imprimir um fundo verde na tabela que crio com o objeto printer, mas todo vez que preencho, os valores ficam por trás do fundo, o que eu estou fazendo de errado?
Antes eu achava que se eu imprimisse primeiro o fundo, depois as tabelas e os dados em seguida, daria certo, mas ocorreu o mesmo problema que acontece se eu imprimir na ordem inversa.
Para desenhar o fundo estou fazendo assim:

Sub desenha_linha(...)
Const sinMM As Single = 567

Printer.FillStyle = 1 '1
Printer.Line ((sinX1 * sinMM), (sinY1 * sinMM))-((sinX2 * sinMM), (sinY2 * sinMM)), lngCor, BF
end sub

USUARIO.EXCLUIDOS 20/08/2007 15:12:00
#231679
Resposta escolhida
Marcelo,

Faça o seguinte teste, crie um projeto novo, coloque em um for um Picture Box. Coloque a propriedade AutoRedraw como True.

Coloque isto no Form_Load()
    Picture1.FillStyle = 1   '1
Picture1.Line ((1 * sinMM), (1 * sinMM))-((5 * sinMM), (2 * sinMM)), &HE0E0E0, BF

Picture1.CurrentX = 600
Picture1.CurrentY = 600
Picture1.Print "Marcelo"



Irá verificar que ficou por cima do fundo cinza a palavra "Marcelo".

Creio que no Printer o resultado deveria ser o mesmo.
Não existe a possibilidade de vc postar um pouquinho mais do seu código para verificarmos o que pode estar acontecendo ?
TAMANINI 20/08/2007 16:17:33
#231695
Sim, com a picture funciona, eu até faço isso para desenhar o gráfico.
Também acreditava que era para ser igual, mas pelo jeito não é.

O que eu poderia passar a mais do meu código? O que posso fazer é um pequeno teste, no qual faria impressão do fundo e logo em seguida imprimia um texto por cima para ver se funciona, o que acha?
USUARIO.EXCLUIDOS 20/08/2007 16:56:35
#231700
Acho que seria uma boa...

faça igual eu fiz ali com o Picture, porém com o printer.
Em um projeto separado mesmo.


Se funcionar, provavelmente é algum erro na lógica da montagem e tudo mais. Creio que aos poucos você consegue chegar no erro final.
TAMANINI 20/08/2007 17:55:05
#231713
Fiz aqui um exemplo a parte e realmente funciona se eu imprimir primeiro o fundo e depois o texto.
Tentei alterar no meu projeto, mas não funcionou.
Tudo indica que seja por causa dos tab() que eu utilizo, pois se eu fizer sem o tab funciona:
If intContJ >= bytLeitIniT And intContJ <= bytLeitFimT Then
Printer.Line ((1.2 * 567), (sinY * 567))-((9.15 * 567), ((sinY + 0.4) * 567)), 12777919, BF

Printer.CurrentX = 1.2 * sinMM
Printer.CurrentY = sinY * sinMM

Printer.Print Format$(intContJ, "000");
End If


Printer.Print Tab(12); Format$(intContJ, "000");
Printer.Print Tab(19); Format$(intNLTrat(intContJ - 1), "000");
Printer.Print Tab(26); strHrT(intContJ - 1);



No exemplo acima, o texto que está dentro do IF, é impresso na frente, mas os que tem Tab() não. O que posso fazer?
USUARIO.EXCLUIDOS 21/08/2007 09:46:06
#231788
Olha Marcelo... talvez lhe de um BOM TRABALHO fazer isso, mas vc pode trocar o Tab() pelo Printer.CurrentX.


ou então uma pequena Gambi! rs... se não me engano o Tab() pula cololunas certo? Vc poderia concatenar alguns espaçoes antes do seu texto, algo do tipo...

   Printer.Print String(12, " ") &  Format$(intContJ, "000");
Printer.Print String(19, " ") & Format$(intNLTrat(intContJ - 1), "000");
Printer.Print String(26, " ") & strHrT(intContJ - 1);


Só testando mesmo pra ter certeza que vai funcionar.
TAMANINI 24/08/2007 17:48:07
#232621
Deu certo aqui com o tab. Só tive que dividir a função que estava muito grande, no qual imprimia, o cabeçalho e os dados das duas colunas. Nisso agora tem uma sub apenas para imprimir os cabeçalhos da tabela e outra sub para imprimir os dados.
Meu problema agora é como fazer para que imprima em ordem crescente os dados, na tabela 1 e depois na tabela 2.
Eu fiz exemplo bem rápido aqui, mas gostaria de opiniões se tem como melhorar:
Dim sinini As Single
Dim sinfim As Single
Dim intCont As Integer

intProd = 0
sinini = sinLineY1_2
For intCont = 0 To 1
sinfim = sinLineY1_2
sinLineY1_2 = sinini
Do While intProd < intTotProd
sinLineY1_2 = sinLineY1_2 + 0.32

strResumo = cIdioma.ReadString("resumoRel", "prodEmp")
strResumo = Replace(strResumo, "\%1", strProduto(intProd))
strResumo = Replace(strResumo, "\%2", lngVolume(intProd) & " " & strUnid(intProd))
strResumo = Replace(strResumo, "\%3", strEmpresa(intProd))
If intProd < CInt((intTotProd / 2) + 0.5) Then
Call printTexto(0.7, sinLineY1_2, "Tahoma", 8, False, strResumo)
Else
Call printTexto(9.5, sinLineY1_2, "Tahoma", 8, False, strResumo)
End If
intProd = intProd + 1

If intProd = CInt((intTotProd / 2) + 0.5) Then Exit Do
Loop
Next intCont
sinLineY1_2 = sinfim


Antes eu imprimia em ordem crescente pela linha das tabelas, algo como:
001    002
003 004
005 006


Um outro jeito seria imprimir como eu fazia antes, de linha em linha, mas que ficasse em ordem crescente pelas tabelas. O que acham? Seria mais complicado e utilizaria mais variáveis?

TAMANINI 27/08/2007 08:57:14
#232766
Alguém? Só uma opinião, pessoal.
SILVERDRAGON 27/08/2007 09:36:12
#232775
Da uma olhada aqui...


http://www.macoratti.net/printer.htm


flw
TAMANINI 27/08/2007 10:17:00
#232796
Vlw, Silver. Mas eu queria mesmo uma opinião, sobre qual seria a melhor forma de imprimir uma tabela em duas colunas.
No caso, eu até fiz um exemplo acima, no qual eu utilizo um laço para imprimir a tabela da esquerda e depois volta para a posição de inicio da tabela da esquerda para imprimir o restante dos dados na tabela da direita.
Essa seria a melhor maneira ou seria melhor eu ir imprimindo as duas tabelas ao mesmo tempo, linha por linha?
SILVERDRAGON 27/08/2007 10:23:35
#232797
Acho melhor imprimir as 2 ao mesmo tempo linha por linha..
Tópico encerrado , respostas não são mais permitidas