Array
(
)

Como Imprimir utilizando TPrinter - para quem tem problemas!

Edilcimar
   - 23 nov 2005

Um problema que tenho visto com grande freqüência no fórum, são pessoas com problemas de impressão utilizando o TPrinter, a maioria dos programadores utiliza geradores de impressão pela facilidade de utilizá-los, ou até mesmo pelo fato de não saberem utilizar a impressão direta, quer por TPrinter ou utilizando o WriteLn. O TPrinter possui a vantagem de poder utilizar qualquer tipo e tamanho de fonte existente no Windows, enquanto que no WriteLn utiliza-se as fontes existentes na impressora, que além de limitadas variam de impressora para impressora
Vamos a um exemplo completo com explicações de cada passo e o porquê de cada ato.
O programa baseia-se em um form contendo um botão para a impressão de dados, os quais poderão ser tirados de uma tabela, uma tabela com filtro ou através de SQL, o que não faz a menor diferença, se quiser colocar um DBGrid para a visualização dos dados, nada impede.
Vamos supor a impressão de um relatório parcial de vendas durante um determinado período, a parte da seleção do período não será mostrada.

Coloque Printers no uses do Form
Procedure TForm1.Button1Click(Sender : TObject);
Var
Linha, Coluna, Quantidade : Integer;
IndiceHorizontal, IndiceVertical, Total, TotalGeral : Real;
Código : String;
Begin
Button1.Enabled := False; // isto é para evitar que o usuário ache que a impressão está demorando e acione o botão diversas vezes provocando diversas impressões
Cursor := crHourGlass // coloca a ampulheta para informar ao usuário que o computador está efetuando um trabalho
IndiceHorizontal := Printer.PageWidth / 960;
IndiceVertical := Printer.PageHeight / 1584;
Estes dois índices horizontal e vertical são utilizados para ajustar a impressão em qualquer impressora, quer seja matricial ou jato de tinta em qualquer resolução, os números 960 e 1584 foram tirados da minha matricial com uma resolução de 120 x 144 pixels e usando papel A4. Pegue a sua impressora, escolha um tamanho de papel e uma resolução qualquer e dê um showmessage(inttostr(printer.pagewidth) + ‘ ‘ + inttostr(printer.pageheight)) para achar estes números. Na sua configuração inicial as duas divisões terão como resultado o número um, porém se modificar a resolução da impressora, ou o tamanho do papel verá que estes números mudarão, estes números serão utilizados logo abaixo.
Printer.Font.Name := ‘Arial’; // utilizo a fonte arial por ser uma fonte que normalmente está em todos os computadores
Printer.Orientation := poPortrait; // aqui certifica-se que o papel será impresso na forma retrato, pois poderia estar configurado para Printer.Orientation := poLandScape que é o modo paisagem, caso mude para o modo paisagem o printer.pagewidth e printer.pageheight devem ter os seus valores invertidos
Printer.BeginDoc; // inicia o serviço de impressão
Linha := 0;
Quantidade := 0;
TotalGeral := 0; // zera as variáveis;
With Table1 do // pega os dados de uma tabela, mas poderia ser uma Query
Begin
First; // é para confirmar que a tabela está no primeiro registro desejado, esta tabela poderá estar filtrada, caso exista uma DBGrid o usuário poderá ter selecionado algo e não estar no primeiro registro
While not eof do // para imprimir toda a tabela
Begin
With Printer.Canvas do // para evitar a digitação de printer.canvas em cada comando de impressão, o canvas é o responsável pelo processo de “desenho” no windows
Begin
If Linha = 0 then // verifica se é início de página para colocar um cabeçalho
Begin;
Font.Size := 10; // tamanho da fonte para o cabeçalho
Coluna := Round(150 * IndiceHorizontal); // aqui, é efetuada a correção para a resolução horizontal da impressora onde 150 é a posição na coluna onde estou querendo imprimir, nos arredondamentos efetuados o erro máximo será de um pixel, o que não será notado pelo usuário
TextOut(Coluna, Linha, ‘NOME DA EMPRESA’); // a coluna e a linha TEM que ser número inteiro, o texto entre aspas poderá ser uma variável tipo string
Coluna := Round(720 * IndiceHorizontal);
TextOut(Coluna, Linha, DateToStr(Now)); // impressão da data
Linha := Linha + Round(23 * IndiceVertical); aqui pega o valor da linha, faz o acréscimo e a correção da resolução vertical da impressora
Coluna := Round(250 * IndiceHorizontal);
TextOut(Coluna, Linha, ‘Venda entre: ‘ + MaskEdit1.Text + ‘ e ‘ + MaskEdit2.Text)); // imprime a informação do período
Linha := Linha + Round(28 * IndiceVertical);
Font.Size := 9;
Coluna := 0;
TextOut(Coluna, Linha, ‘CÓDIGO’); // este e os seguintes são os nomes das colunas a serem impressas
Coluna := Round(90 * IndiceHorizontal);
TextOut := Round(Coluna, Linha, ‘QUANT’);
Coluna := Round(170 * IndiceHorizontal);
TextOut(Coluna, Linha, ‘VALOR’); // acrescente quantas colunas a mais precisar utilizando o mesmo princípio
Linha := Linha + (Round(25 * IndiceVertical);
End;
Coluna := 0;
Código := IntToStr(FieldByName(‘CODIGOPRODUTO’).AsInteger); // transforma o código de inteiro para string para a impressão, para mostrar a utilização de variável e utilizando o tipo de campo;
TextOut(Coluna, Linha, Código); // imprime o código do produto
Coluna := Round(90 * IndiceHorizontal);
TextOut(Coluna, Linha, IntToStr(FieldByName(´QUANTIDADEVENDIDA’).Value)); // imprime sem utilização de variável e utilizando VALUE em vez do tipo do campo
Total := FieldByName(‘TOTAL’).AsFloat; // joga o valor do total em uma variável;
TotalGeral := TotalGeral + Total; // soma o total geral para impressão no final
Quantidade := Quantidade + 1; // soma a quantidade de produtos vendidos para a impressão no final
Coluna := Round(170 * IndiceHorizontal);
TextOut(Coluna, Linha, FloatToStrF(Total, ffFixed, 10, 2)); // pega o valor e formata o mesmo para um valor fixo com duas casas decimais. O ffFixed também pode ser ffGeneral, ffExponent, ffNumber ou ffCurrency, veja o help do Delphi
Linha := Linha + Round(20 * IndiceVertical);
If Linha >= 1440 then // verifica se já chegou no local onde quero terminar a impressão da página
Begin
Linha := 0; // zera o valor da linha para a impressão do cabeçalho na outra página, se quiser fazer controle de impressão de número de página também pode colocar aqui para que o mesmo seja impresso no final da página
Printer.NewPage; // ejeta a página
Se quiser pode acrescentar um contador de páginas aqui e imprimir o número da página
End;
End;
End;
Next; // vai para o próximo registro da tabela
End;
Printer.Canvas.Font.Size := 10; // troca o tamanho da fonte
Linha := Linha + Round(25 * IndiceVertical);
If Linha > 1400 then // verifica a posição no papel para ter certeza que a impressão ficará inteira na mesma página
Printer.NewPage;
Coluna := 0;
Printer.Canvas.TextOut(Coluna, Linha, ‘QUANTIDADE TOTAL DE ÍTENS: ’ + IntToStr(Quantidade)); // aqui também poderia ser a quantidade total de produtos vendidos, é só uma questão de escolha do que vai ser impresso
Linha := Linha + Round(25 * IndiceVertical);
Printer.Canvas.TextOut(Coluna, Linha, ‘VALOR TOTAL: ‘ + FloatToStrF(TotalGeral, ffCurrency, 10, 2); // aqui em vez de ffFixed utilizei ffCurrency para que na impressão apareça o R$
Printer.EndDoc; // com este comando acaba a impressão ejetando a página, caso não seja colocado a ejeção acontecerá porém o documento demorará mais tempo para ser impresso
Cursor := crDefault; // volta o cursor ao estado original

Apesar de aparentemente muito trabalhosa, esta impressão, depois que a pessoa se acostuma, é bem rápida, desde que sempre se utilize uma mesma resolução de desenvolvimento, pois o desenvolvedor acostuma-se com a noção de espaço horizontal e vertical e já não precisa mais efetuar diversas impressões do documento para efetuar ajustes.

Edilcimar Reis Félix – Vitória - ES


Smfnurrali
   - 22 dez 2005

Edilcimar,

Agradeço sua preocupação com todos nós que temos problema de relacionamentos com nossas temperamentais matriciais e/ou jato de tinta.

Eu tenho um grande problema.

Quando uso impressão com TPrinter, em uma rotina de impressão de boletos. Ele só imprime até o terceiro boleto em qualquer impressora.
Verifiquei que, se eu gerar um arquio bmp com o Canvas, todos os boletos saem corretamente. Tentei imprimir pelo Paint (O arquivo gerado)sai corretamente. Desta forma soube que não era problema nem da rotina de impressão, na qual gera o arquivo corretamente, nem do driver ou do Sistema operacional, pois imprime corretamenete.
Tentei gerar o arquivo e imprimir o bmp por dentro do delphi, mas o
resultado é exatamente o mesmo. Só imprime 3 boletos. Estes 3 boletos são exatamente o tamanho de uma página A4. Não sei se estes fatos tem
relação.
Alem destes, fiz muitos testes aqui. E no geral, não consigo imprimir no
Delphi usando TPrinter(Com geradores de relatório como por exemplo
o QuickReport, funciona perfeitamente) mais de 3 boletos se eu não
der um ´NewPage´. O Caso é que, se eu der um NewPage, ele vai pular o tamanho de uma página, consequentemente, pular 3 boletos e imprimir errado. O incrível é que nem uma impressão simples como a no código abaixo fuinciona

var
ct : integer;
begin
printer.BeginDoc;
for ct := 0 to 1000 do
printer.Canvas.TextOut(50, 50*ct, IntToStr(ct));
printer.EndDoc ;

este código só imprime até um determinado número dependendo da
resolução da impressora, mas sempre no tamanho de 1 página a4.

O mais incrível, é que a mesma rotina funcionava a alguns dias
atras.

E outra coisa que me deixa muito intrigada é que de uma maquina para uma determinada impressora imprime tudo , mas de outra máquina pra mesma impressora naum imprime.

se vc quiser eu posso te mandar o meu fonte para vc dar uma olhada, isso é claro se estiver disposto a me ajudar a resolver este mistério.

Desde já agradeço.


Emerson
   - 22 dez 2005

creio que você precise verificar se não chegou ao fim da página, saltar para uma nova página (eject) e recomeçar a impressão. note que a linha terá de ser reiniciada. a instrução 50*ct deverá ser revista.


Smfnurrali
   - 22 dez 2005


Citação:
creio que você precise verificar se não chegou ao fim da página, saltar para uma nova página (eject) e recomeçar a impressão. note que a linha terá de ser reiniciada. a instrução 50*ct deverá ser revista.



Vamos devagar.... como vc faria ??? O que na instrução 50*CT deve ser revisto???


Emerson
   - 22 dez 2005

algo assim (não testei):

#Código

procedure TForm1.Button1Click(Sender: TObject);
var
linha, ct : integer;
begin
Printer.BeginDoc;
linha := 0;
for ct := 0 to 1000 do
begin
// avalio se a linha "caberá" na página.
// se não couber, salta a página e
// começa novamente na 1a. linha
if (50*linha) > Printer.PageHeight then
begin
Printer.NewPage;
linha := 0;
end;
Printer.Canvas.TextOut(50,50*linha, IntToStr(ct));
inc(linha);
end;
Printer.EndDoc;
end;



Edilcimar
   - 22 dez 2005

Desculpem-me é que fazia tempo que não lia a respeito disto, pois pensei que havia sido bem claro a respeito, mas como recebi uma mensagem particular a respeito voltei ao tema
O princípio básico da impressão é o seguinte:
Uma página tem um tamanho, que apesar de aparentemente fixo, em relação a cm, pol, ou qualquer outra unidade de medida, ele é variável em relação a quantidade de pixels ou dpis, ou seja se uma folha tem 10cm de largura e 20 cm de comprimento(isto não é uma das medidas padrão de nenhuma folha), esta medida para a impressora varia de acordo com a RESOLUÇÃO de impressão da mesma, portanto se usarmos o exemplo dado, se colocarmos uma resolução AxB em uma folha A4 teremos para o exemplo dado anteriormente uma largura de 100¬ e uma algura de 100¬, e sobre isto é montada a minha impressão, porém se eu alterar a minha resolução para utilizando o mesmo A4 para uma resolução de 2Ax2B, ou seja o dobro da resolução e mandar imprimir sobre o mesmo ponto toda a impressão será encavalada, tanto na horizontal como na vertical, por este motivo é que eu coloquei os índices vertical e horizontal para compensar isto e fazer com que a impressão saia exatamente no mesmo ponto, exceto é claro como anteriormente explicato com o erro de 1 pixel ou dpi, e podem ter certeza que é este o mesmo princípio de qualquer gerenciador de impressão(no máximo um de diferença, o que é impreceptível).
Assim sendo, se uso um índice vertical para a resolução AxB (a minha resolução básica) este resultado será igual a 1, porém se dobrar esta resolução o resultado será igual a 2, com as contas efetuadas, haverá a compensação (pela resolução) e a impressão sairá no mesmo ponto, e isto é válido para qualquer outro tipo de resolução, pois a variável fará o respectivo ajuste de forma a efetuar esta ´conta´, e isto tem que ser feito tanto na horizontal quanto na vertical


Adriano Santos
   - 22 dez 2005

Edilcimar, gostei bastante de sua iniciativa, pois realmente o tema ´impressão´ em nosso fórum é bastante citado e mostra que muitos programadores tem dificuldades. Parabéns, acho que foi bastante esclarecedor.


Martins
   - 22 dez 2005


Citação:
Edilcimar, gostei bastante de sua iniciativa, pois realmente o tema ´impressão´ em nosso fórum é bastante citado e mostra que muitos programadores tem dificuldades. Parabéns, acho que foi bastante esclarecedor.


Adriano permita-me fazer minhas as suas palavras.

Valew Edilcimar!!!!


Adriano Santos
   - 22 dez 2005


Citação:

Citação:
Edilcimar, gostei bastante de sua iniciativa, pois realmente o tema ´impressão´ em nosso fórum é bastante citado e mostra que muitos programadores tem dificuldades. Parabéns, acho que foi bastante esclarecedor.


Adriano permita-me fazer minhas as suas palavras.

Valew Edilcimar!!!!


Permito sim claro, são de pessoas assim que precisamos no fórum e graças a Deus temos muitos profissionais afim de compartilhar seus conhecimentos, por isso o sucesso.


Edilcimar
   - 24 dez 2005

Qualquer coisa estamos aqui!


Rodolphogagno
   - 03 jan 2006

Edilcimar, estou fazendo a impressão usando o TPrinter, estou imprimindo uma nota fiscal que foge os padrões normais de tamanho, ela tem 1615x1562. PAssando o olho de cima para baixo, ao chegar no meio da folha, ele começa a imprimir torto, de início achei que era a impressora que estava puxando a folha torta, mas outras impressões usando o mesmo tamanho de folha não faz isso... Tem alguma sugestão?

Obrigado pela atenção...


Pereiramarcos
   - 03 jan 2006

que iniciativa louvavel, mas ja tive muitas dicas ´ajuda´ suas e agora este artigo seu parabens. e mais uma vez obrigado

sensasional!!!!!!!!!!!!!!!!.


Edilcimar
   - 03 jan 2006

realmente nunca vi isto, eu tenho cliente com NF de tamanho fora do padrão, mas a impressão é normal em todas as folhas, não ´puxa´ a página torta, mostre o código de impressão para poder ver se há algum erro!


Rodolphogagno
   - 03 jan 2006

procedure TF_PedVenda.ImprimeNota;
var
//Variáveis usadas na impressão da Nota Fiscal
inLinha, inColuna : Integer;
reIndiceHorizontal, reIndiceVertical : Real;
stCodigo : String;
begin
QNota.Close;
QNota.ParamByName(´intPedVenda´).AsInteger := intPedVenda;
QNota.Open;

QNotaProduto.Close;
QNotaProduto.ParamByName(´intPedVenda´).AsInteger := intPedVenda;
QNotaProduto.Open;

BTN_Nota.Enabled := False;
Cursor := crHourGlass;
reIndiceHorizontal := printer.PageWidth / 1615;
reIndiceVertical := printer.PageHeight / 1562;
printer.Canvas.Font.Name := ´Arial´;
printer.Orientation := poPortrait;
printer.BeginDoc;
inLinha := 0;
with printer.Canvas do
begin
//Número da Nota
Font.Size := 14;
inColuna := Round(1455 * reIndiceHorizontal);
inLinha := Round(35 * reIndiceVertical);
TextOut(inColuna, inLinha, QNotaI_NumNota.AsString);
//Marcar Nota de Saida com um ´X´
Font.Size := 10;
inColuna := Round(1190 * reIndiceHorizontal);
inLinha := Round(80 * reIndiceVertical);
TextOut(inColuna, inLinha, ´X´);
//Alimenta o campo ´Dados Adicionais da Nota´
Font.Size := 8;
inColuna := Round(12 * reIndiceHorizontal);
inLinha := Round(122 * reIndiceVertical);
TextOut(inColuna, inLinha, ´Complement 1 - 1/2´);//Copy(QNotaC_InfComplem1.AsString, 1, 40));
inLinha := Round(125 * reIndiceVertical);
inColuna := Round(400 * reIndiceHorizontal);
if QNotaC_CF1.AsString <> ´´ then
TextOut(inColuna, inLinha, QNotaC_CF1.AsString+´-´+QNotaC_CodCF1.AsString)
;
inColuna := Round(12 * reIndiceHorizontal);
inLinha := Round(140 * reIndiceVertical);
TextOut(inColuna, inLinha, ´Complement 1 - 2/2´);//Copy(QNotaC_InfComplem1.AsString, 41, 80));
inColuna := Round(400 * reIndiceHorizontal);
if QNotaC_CF2.AsString <> ´´ then
TextOut(inColuna, inLinha, QNotaC_CF2.AsString+´-´+QNotaC_CodCF2.AsString)
;
inLinha := Round(160 * reIndiceVertical);
inColuna := Round(12 * reIndiceHorizontal);
TextOut(inColuna, inLinha, ´Complement 2 - 1/2´);//Copy(QNotaC_InfComplem2.AsString, 1, 40));
inColuna := Round(400 * reIndiceHorizontal);
if QNotaC_CF3.AsString <> ´´ then
TextOut(inColuna, inLinha, QNotaC_CF3.AsString+´-´+QNotaC_CodCF3.AsString)
;
inLinha := Round(180 * reIndiceVertical);
inColuna := Round(12 * reIndiceHorizontal);
TextOut(inColuna, inLinha, ´Complement 2 - 2/2´);//Copy(QNotaC_InfComplem2.AsString, 41, 80));
inColuna := Round(400 * reIndiceHorizontal);
if QNotaC_CF4.AsString <> ´´ then
TextOut(inColuna, inLinha, QNotaC_CF4.AsString+´-´+QNotaC_CodCF4.AsString)
;
inLinha := Round(200 * reIndiceVertical);
inColuna := Round(12 * reIndiceHorizontal);
if QNotaC_EnderecoCOB.AsString <> ´´ then
TextOut(inColuna, inLinha, ´Cobrança 1/2´);//´Cobr:´+Copy(QNotaC_EnderecoCOB.AsString, 1, 40))
;
inColuna := Round(400 * reIndiceHorizontal);
if QNotaC_CF5.AsString <> ´´ then
TextOut(inColuna, inLinha, QNotaC_CF5.AsString+´-´+QNotaC_CodCF5.AsString)
;
Font.Size := 10;
inColuna := Round(560 * reIndiceHorizontal);
TextOut(inColuna, inLinha, QNotaC_NatOper.AsString); //Natureza de Operação

inColuna := Round(880 * reIndiceHorizontal);
TextOut(inColuna, inLinha, QNotaC_CFOP.AsString); // CFOP

Font.Size := 8;
inColuna := Round(12 * reIndiceHorizontal);
inLinha := Round(220 * reIndiceVertical);
TextOut(inColuna, inLinha, ´Cobrança 2/2´);//´ ´+Copy(QNotaC_EnderecoCOB.AsString, 41, 50));
inColuna := Round(400 * reIndiceHorizontal);
if QNotaC_CF6.AsString <> ´´ then
TextOut(inColuna, inLinha, QNotaC_CF6.AsString+´-´+QNotaC_CodCF6.AsString)
;
inColuna := Round(45 * reIndiceHorizontal);
inLinha := Round(240 * reIndiceVertical);
TextOut(inColuna, inLinha, ´Municipio+UF+CEP´);{QNotaC_MunicipioCOB.AsString+´-´+
QNotaC_UFCOB.AsString+´ ´+QNotaC_CEPPreFixoCOB.AsString+
´-´+QNotaC_CEPComplementoCOB.AsString);}
inColuna := Round(400 * reIndiceHorizontal);
if QNotaC_CF7.AsString <> ´´ then
TextOut(inColuna, inLinha, QNotaC_CF7.AsString+´-´+QNotaC_CodCF7.AsString)
;
inColuna := Round(15 * reIndiceHorizontal);
inLinha := Round(260 * reIndiceVertical);
if QNotaC_EnderecoENT.AsString <> ´´ then
TextOut(inColuna, inLinha, ´Entr:´+QNotaC_EnderecoENT.AsString)
;
inColuna := Round(400 * reIndiceHorizontal);
if QNotaC_CF8.AsString <> ´´ then
TextOut(inColuna, inLinha, QNotaC_CF8.AsString+´-´+QNotaC_CodCF8.AsString)
;
Font.Size := 10;
inLinha := Round(262 * reIndiceVertical);
inColuna := Round(560 * reIndiceHorizontal);
TextOut(inColuna, inLinha, QNotaC_Nome.AsString); // Nome-Razão Social

inColuna := Round(1190 * reIndiceHorizontal);
if QNotaC_CGC.AsString <> ´´ then
TextOut(inColuna, inLinha, QNotaC_CGC.AsString) // CNPJ
else
TextOut(inColuna, inLinha, QNotaC_CPF.AsString) // CPF
;

inColuna := Round(1455 * reIndiceHorizontal);
TextOut(inColuna, inLinha, QNotaD_DtEmissao.AsString); // Data da Emissão

Font.Size := 8;
inColuna := Round(40 * reIndiceHorizontal);
inLinha := Round(280 * reIndiceVertical);
if QNotaC_UFENT.AsString <> ´´ then
TextOut(inColuna, inLinha, QNotaC_MunicipioENT.AsString+´-´+QNotaC_UFENT.AsString
+´ ´+QNotaC_CEPPreFixoENT.AsString+´-´+QNotaC_CEPComplementoENT.AsString)
;
inColuna := Round(400 * reIndiceHorizontal);
if QNotaC_CF9.AsString <> ´´ then
TextOut(inColuna, inLinha, QNotaC_CF9.AsString+´-´+QNotaC_CodCF9.AsString)
;
inLinha := Round(300 * reIndiceVertical);
inColuna := Round(400 * reIndiceHorizontal);
//if QNotaC_CF10.AsString <> ´´ then
TextOut(inColuna, inLinha, ´CF10´);//QNotaC_CF10.AsString+´-´+QNotaC_CodCF10.AsString)
;
Font.Size := 10;
inLinha := Round(312 * reIndiceVertical);
inColuna := Round(560 * reIndiceHorizontal);
TextOut(inColuna, inLinha, Copy(QNotaC_Endereco.AsString, 1, 45)); // Endereço

inColuna := Round(1045 * reIndiceHorizontal);
TextOut(inColuna, inLinha, QNotaC_Bairro.AsString); // Bairro - Distrito

inColuna := Round(1305 * reIndiceHorizontal);
TextOut(inColuna, inLinha, QNotaC_CEPPreFixo.AsString+´-´+QNotaC_CEPComplemento.AsString); // CEP


inColuna := Round(1455 * reIndiceHorizontal);
TextOut(inColuna, inLinha, QNotaD_DtSaidaEntrada.AsString); // Data da Saída - Entrada

inLinha := Round(360 * reIndiceVertical);
inColuna := Round(560 * reIndiceHorizontal);
TextOut(inColuna, inLinha, QNotaC_Municipio.AsString); // Município

inColuna := Round(965 * reIndiceHorizontal);
TextOut(inColuna, inLinha, QNotaC_DDD1.AsString+QNotaC_Fone1.AsString); // Fone - Fax

inColuna := Round(1125 * reIndiceHorizontal);
TextOut(inColuna, inLinha, QNotaC_UF.AsString); // UF

inColuna := Round(1190 * reIndiceHorizontal);
if QNotaC_CGC.AsString <> ´´ then
TextOut(inColuna, inLinha, QNotaC_InscEst.AsString) // Inscrição Estadual
else
TextOut(inColuna, inLinha, QNotaC_RG.AsString) // RG
;

inColuna := Round(1455 * reIndiceHorizontal);
TextOut(inColuna, inLinha, QNotaC_Hora.AsString); // Hora da Saída
Font.Size := 8;
if QNotaI_NumFaturaDupl1.AsString <> ´´ then
begin
// F A T U R A 1
inColuna := Round(560 * reIndiceHorizontal);
inLinha := Round(430 * reIndiceVertical);
TextOut(inColuna, inLinha, QNotaI_NumFaturaDupl1.AsString+´-´+QNotaI_ParcelaDupl1.AsString); //Número
inColuna := Round(712 * reIndiceHorizontal);
TextOut(inColuna, inLinha, QNotaD_DtVencto1.AsString); // Vencimento
inColuna := Round(870 * reIndiceHorizontal);
TextOut(inColuna, inLinha, QNotaN_VlVencto1.AsString); //Valor
end
;
//if QNotaI_NumFaturaDupl2.AsString <> ´´ then
/// begin
// F A T U R A 2
inColuna := Round(1080 * reIndiceHorizontal);
inLinha := Round(430 * reIndiceVertical);
TextOut(inColuna, inLinha, ´Numero´);//QNotaI_NumFaturaDupl2.AsString+´-´+QNotaI_ParcelaDupl2.AsString); //Número
inColuna := Round(1235 * reIndiceHorizontal);
TextOut(inColuna, inLinha, ´Vencimento´);//QNotaD_DtVencto2.AsString); // Vencimento
inColuna := Round(1408 * reIndiceHorizontal);
TextOut(inColuna, inLinha, ´Valor´);//QNotaN_VlVencto2.AsString); //Valor
// end
// ;
// if QNotaI_NumFaturaDupl3.AsString <> ´´ then
// begin
// F A T U R A 3
inColuna := Round(560 * reIndiceHorizontal);
inLinha := Round(447 * reIndiceVertical);
TextOut(inColuna, inLinha, ´Numero´);//QNotaI_NumFaturaDupl3.AsString+´-´+QNotaI_ParcelaDupl3.AsString); //Número
inColuna := Round(712 * reIndiceHorizontal);
TextOut(inColuna, inLinha, ´Vencimento´);//QNotaD_DtVencto3.AsString); // Vencimento
inColuna := Round(870 * reIndiceHorizontal);
TextOut(inColuna, inLinha, ´Valor´);//QNotaN_VlVencto3.AsString); //Valor
// end
// ;
if QNotaI_NumFaturaDupl4.AsString <> ´´ then
begin
// F A T U R A 4
inColuna := Round(1080 * reIndiceHorizontal);
inLinha := Round(447 * reIndiceVertical);
TextOut(inColuna, inLinha, QNotaI_NumFaturaDupl4.AsString+´-´+QNotaI_ParcelaDupl4.AsString); //Número
inColuna := Round(1235 * reIndiceHorizontal);
TextOut(inColuna, inLinha, QNotaD_DtVencto4.AsString); // Vencimento
inColuna := Round(1408 * reIndiceHorizontal);
TextOut(inColuna, inLinha, QNotaN_VlVencto4.AsString); //Valor
end
;
// if QNotaI_NumFaturaDupl5.AsString <> ´´ then
// begin
// F A T U R A 5
inColuna := Round(560 * reIndiceHorizontal);
inLinha := Round(464 * reIndiceVertical);
TextOut(inColuna, inLinha, ´Numero 5 ´);//QNotaI_NumFaturaDupl5.AsString+´-´+QNotaI_ParcelaDupl5.AsString); //Número
inColuna := Round(712 * reIndiceHorizontal);
TextOut(inColuna, inLinha, ´Vencimento´);//QNotaD_DtVencto5.AsString); // Vencimento
inColuna := Round(870 * reIndiceHorizontal);
TextOut(inColuna, inLinha, ´Valor´);//QNotaN_VlVencto5.AsString); //Valor
// end
// ;
if QNotaI_NumFaturaDupl6.AsString <> ´´ then
begin
// F A T U R A 6
inColuna := Round(1080 * reIndiceHorizontal);
inLinha := Round(464 * reIndiceVertical);
TextOut(inColuna, inLinha, QNotaI_NumFaturaDupl6.AsString+´-´+QNotaI_ParcelaDupl6.AsString); //Número
inColuna := Round(1235 * reIndiceHorizontal);
TextOut(inColuna, inLinha, QNotaD_DtVencto6.AsString); // Vencimento
inColuna := Round(1408 * reIndiceHorizontal);
TextOut(inColuna, inLinha, QNotaN_VlVencto6.AsString); //Valor
end
;
// D A D O S D O S P R O D U T O S
QNotaProduto.First;
Font.Size := 8;
inLinha := Round(530 * reIndiceVertical);
while not QNotaProduto.Eof do
begin
inColuna := Round(12 * reIndiceHorizontal);
inLinha := inLinha + 20;
inLinha := Round(inLinha * reIndiceVertical);
TextOut(inColuna, inLinha, QNotaProdutoI_CodProduto.AsString); // Código Produto
inColuna := Round(105 * reIndiceHorizontal);
TextOut(inColuna, inLinha, QNotaProdutoC_Descricao_1.AsString); // Descrição dos Produtos
inColuna := Round(570 * reIndiceHorizontal);
TextOut(inColuna, inLinha, QNotaProdutoC_Descricao_3.AsString); // Referência
inColuna := Round(860 * reIndiceHorizontal);
TextOut(inColuna, inLinha, QNotaProdutoC_Descricao_2.AsString); // Marca
inColuna := Round(965 * reIndiceHorizontal);
TextOut(inColuna, inLinha, QNotaProdutoC_SiglaCF.AsString); // Clas. Fisc.
inColuna := Round(1002 * reIndiceHorizontal);
TextOut(inColuna, inLinha, QNotaProdutoC_SitTributaria.AsString); // Sit. Trib.
inColuna := Round(1035 * reIndiceHorizontal);
TextOut(inColuna, inLinha, QNotaProdutoC_Unidade.AsString); // UN.
inColuna := Round(1065 * reIndiceHorizontal);
TextOut(inColuna, inLinha, QNotaProdutoN_Qtde.AsString); // Quant.
inColuna := Round(1125 * reIndiceHorizontal);
TextOut(inColuna, inLinha, QNotaProdutoN_VlUnitario.AsString); // Valor Unitário
inColuna := Round(1260 * reIndiceHorizontal);
TextOut(inColuna, inLinha, QNotaProdutoValorTotal.AsString); // Valor Total
inColuna := Round(1390 * reIndiceHorizontal);
TextOut(inColuna, inLinha, QNotaProdutoN_VlAliqICMS.AsString); // Alíquotas - ICMS
inColuna := Round(1435 * reIndiceHorizontal);
TextOut(inColuna, inLinha, QNotaProdutoN_VlAliqIPI.AsString); // Alíquotas - IPI
inColuna := Round(1490 * reIndiceHorizontal);
TextOut(inColuna, inLinha, QNotaProdutoN_VlIPI.AsString); // Valor IPI

QNotaProduto.Next;
end
;
if QNotaN_VlDesc.Value > 0 then
begin
inLinha := inLinha + 30;
inLinha := Round(inLinha * reIndiceVertical);
inColuna := Round(80 * reIndiceHorizontal);
TextOut(inColuna, inLinha, ´Desconto de R$´+QNotaN_VlDesc.AsString);
end
;
if QNotaC_InfComplem5.AsString <> ´´ then
begin
inLinha := inLinha + 30;
inLinha := Round(inLinha * reIndiceVertical);
TextOut(inColuna, inLinha, QNotaC_InfComplem5.AsString);
end
;
// Cálculo do Imposto
inColuna := Round(12 * reIndiceHorizontal);
inLinha := Round(1165 * reIndiceVertical);
TextOut(inColuna, inLinha, QrN_VlBaseCalcICMS.AsString); // Base de Cálculo do ICMS
inColuna := Round(120 * reIndiceHorizontal);
TextOut(inColuna, inLinha, QrN_VlICMS.AsString); // Valor do ICMS
inColuna := Round(300 * reIndiceHorizontal);
TextOut(inColuna, inLinha, QNotaN_VlBaseCalcICMSSub.AsString); // Base de Cálculo ICMS Substituição
inColuna := Round(620 * reIndiceHorizontal);
TextOut(inColuna, inLinha, QNotaN_VlICMSSub.AsString); // Valor do ICMS Substituição
inColuna := Round(750 * reIndiceHorizontal);
TextOut(inColuna, inLinha, QNotaN_VlTotProdutos.AsString); // Valor Total dos Produtos

inColuna := Round(12 * reIndiceHorizontal);
inLinha := Round(1215 * reIndiceVertical);
TextOut(inColuna, inLinha, QNotaN_VlFrete.AsString); // Valor do Frete
inColuna := Round(120 * reIndiceHorizontal);
TextOut(inColuna, inLinha, QNotaN_VlSeguro.AsString); // Valor do Seguro
inColuna := Round(300 * reIndiceHorizontal);
TextOut(inColuna, inLinha, QNotaN_VlOutros.AsString); // Outras despesas acessórias
inColuna := Round(620 * reIndiceHorizontal);
TextOut(inColuna, inLinha, QNotaN_VlTotIPI.AsString); // Valor Total do IPI
inColuna := Round(750 * reIndiceHorizontal);
TextOut(inColuna, inLinha, QNotaN_VlTotNota.AsString);// Valor Total da Nota
// FIM CALCULO DO IMPOSTO
// TRANSPORTADOR / VOLUMES TRANSPORTADOS
inColuna := Round(12 * reIndiceHorizontal);
inLinha := Round(1300 * reIndiceVertical);
TextOut(inColuna, inLinha, ´RAZAO SOCIAL´); // Nome - Razão Social
inColuna := Round(450 * reIndiceHorizontal);
TextOut(inColuna, inLinha, ´1´); // Frete por Conta ´1´ ou ´2´
inColuna := Round(510 * reIndiceHorizontal);
TextOut(inColuna, inLinha, ´MPB-7878´); // Placa do Veículo
inColuna := Round(640 * reIndiceHorizontal);
TextOut(inColuna, inLinha, ´ES´); // UF
inColuna := Round(670 * reIndiceHorizontal);
TextOut(inColuna, inLinha, ´093.692.927-80´); // CNPJ-CPF

end
;
printer.EndDoc;
Cursor := crDefault;
BTN_Nota.Enabled := True;
end;


Edilcimar
   - 03 jan 2006

você tem certeza que estes valores estão certos?
reIndiceHorizontal := printer.PageWidth / 1615;
reIndiceVertical := printer.PageHeight / 1562;
em princípio se vc não estiver imprimindo em landscape o pegeheight tem que ser maior que o pagewidth, e como vc não está imprimindo em landscape então isto está errado,
faça o seguinte
antes destas linhas coloque um showmessage(inttostr(printer.pageheight)+ ´ ´+inttostr(printer.pagewidth)), e depois aborte a impressão, pegue estes 2 números que aparecerão e substitua os valores 1615 e 1562 pelos novos, aí deve funcionar


Rodolphogagno
   - 03 jan 2006

eu peguei estes números dando o showmessage mesmo


Edilcimar
   - 03 jan 2006

será que não estão invertidos? normalmente o comprimento de um papel é maior que a sua largura!


Fabiano_aprendiz
   - 13 jan 2006

Pergunta de quem nunca tinha visto nem usado o TPrinter: Tem como usar o TPrinter junto com um gerador de relatórios, como o Quickreport por exemplo?


Edilcimar
   - 13 jan 2006

Até onde sei não, ou usa um ou usa o outro, apesar de que o QR usa o TPrinter


Fabiano_aprendiz
   - 13 jan 2006

Pois é, eu to com um problemão, é q tenho q fazer um relatório q pode ser impresso tanto em formulário continuo como em folhas do formulário destacadas...Eu uso o quickreport e com ele eu faço os ajustes p/cada tipo de formulário(são 4 graficas diferentes p/o formulário, cada uma com suas medidas) e essa alteração pode ser feita pelo propio usuário. O problema é q uma dessas gráficas tbm utiliza o formulário continuo ,estou implementando essa opção mas tá complicado, porq qdo mando imprimir varios formularios de uma unica vz, o primeiro sai legal, mas a partir do segundo ele já salta p/o meio do segundo e por aí vai....não to sabendo como solucionar isso...


Edilcimar
   - 14 jan 2006

1) Você está pagando, portanto pode fazer com que todas as gráficas imprimam com um layout padrão em um tamanho de papel padrão
2)O fato de estar em folha solta ou papel contínuo não muda nada desde que o layout seja o mesmo
3)Você pode ter um botão para imprimir com o QR e outro para o TCanvas
4)Você pode colocar um pagesetupdialog para o usuário escolher o papel antes da impressão
5)Se está saindo direito no primeiro e não no restante, provavelmente é porque o papel não está configurado com o comprimento exato, veja que mesmo 1 mm vai dar diferença