Como Imprimir utilizando TPrinter - para quem tem problemas!

23/11/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


Edilcimar

Respostas

22/12/2005

Smfnurrali

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.


Responder Citar

22/12/2005

Emerson

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 [b:07c5e4fac9]50*ct[/b:07c5e4fac9] deverá ser revista.


Responder Citar

22/12/2005

Smfnurrali

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 [b:d156a79826]50*ct[/b:d156a79826] deverá ser revista.



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


Responder Citar

22/12/2005

Emerson

algo assim (não testei):

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;



Responder Citar

22/12/2005

Edilcimar

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


Responder Citar

22/12/2005

Adriano Santos

[b:c27a919bcd]Edilcimar[/b:c27a919bcd], 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.


Responder Citar

22/12/2005

Martins

[quote:ff419ab3e9=´Adriano Santos´][b:ff419ab3e9]Edilcimar[/b:ff419ab3e9], 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.[/quote:ff419ab3e9]

Adriano permita-me fazer minhas as suas palavras.

Valew Edilcimar!!!!


Responder Citar

22/12/2005

Adriano Santos

[quote:9fb99e0413=´Adriano Santos´][b:9fb99e0413]Edilcimar[/b:9fb99e0413], 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!!!![/quote:9fb99e0413]

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.


Responder Citar

24/12/2005

Edilcimar

Qualquer coisa estamos aqui!


Responder Citar

03/01/2006

Rodolphogagno

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...


Responder Citar

03/01/2006

Pereiramarcos

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

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


Responder Citar

03/01/2006

Edilcimar

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!


Responder Citar

03/01/2006

Rodolphogagno

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;


Responder Citar

03/01/2006

Edilcimar

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


Responder Citar

03/01/2006

Rodolphogagno

eu peguei estes números dando o showmessage mesmo


Responder Citar