D/T> Na minha opinião realmente o "x da questão" está somente no preview, D/T> pois este teria que ser construído caso se deseja. Mas também é um D/T> trabalho que seria feito apenas uma vez e usado em muitas situações D/T> semelhantes.
Concordo, para simplificar a construção de um preview, eu faço a impressão para um TMetaFileCanvas (num WMF), atribuindo-o a um TImage normal podendo assim usar zoom, barras de rolagem, etc... [s] ===================== Eduardo Jedliczka GeraSoft Informática Apucarana - PR ===================== ----- Original Message ----- From: Daniel / Tecnobyte To: [EMAIL PROTECTED] Sent: Thursday, October 28, 2004 2:09 PM Subject: Re: [delphi-br] QR + Matricial, a luta continua > O TPrinter trabalha com milimetros e não com Pixels. > Walter Alves Chagas Junior Você está equivocado. Quando usa-se TPrinter para imprimir, na verdade o posicionamento é feito pelo objeto Cantas associado ao Printer (Printer.Canvas). Normalmente usa-se: Printer.Canvas.TextOut(...); ou Printer.Canvas.TextRect(...); Estes métodos trabalham com posicionamento em pixels e não em milímetros. Quer um exemplo? Então experimente rodar o código abaixo para imprimir em duas impressoras com resoluções diferentes (exemplo: Epson LX300 e HP Deskjet). Printer.BeginDoc; try Printer.Canvas.TextOut(0, 0, 'Zero, Zero'); Printer.Canvas.TextOut(50, 50, 'Cinquenta, Cinquente'); Printer.Canvas.TextOut(100, 100, 'Cem, Cem'); finally Printer.EndDoc; end; Você vai observar que a distância entre os textos impressos variam muito por causa das diferentes resoluções das impressoras. Na Epson LX300 os textos devem ficar bem distantes entre si (a quantidade de pontos por polegada é menor). Já na HP Deskjet esta distância deverá ser bem pequena (a quantidade de pontos por polegada é bem maior). Se Printer trabalhasse com mm, cm ou polegada, o posicionamento não variaria de uma impressora para outra (na prática varia um pouco sim por causa das margens e posicionamento físico do papel). Agora se você quer imprimir em mm, cm ou polegadas, então terá que pegar a resolução da impressora usando uma função da API do Windows (GetDeviceCaps) e fazer as devidas conversões. Eis um exemplo: ---------------------------- Início do código -------------------- var ResolucaoX: integer; ResolucaoY: integer; function mm2px(const X, Y: integer): TPoint; begin Result.X := Trunc(ResolucaoX / 25.4 * X); Result.Y := Trunc(ResolucaoY / 25.4 * Y); end; function cm2px(const X, Y: integer): TPoint; begin Result.X := Trunc(ResolucaoX / 2.54 * X); Result.Y := Trunc(ResolucaoY / 2.54 * Y); end; procedure TForm1.Button1Click(Sender: TObject); var P: TPoint; R: TRect; begin Printer.BeginDoc; try ResolucaoX := GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSX); ResolucaoY := GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSY); { Desenha uma cantoneira de 1cm na posição zero do papel } P := cm2px(1, 1); Printer.Canvas.MoveTo(P.X, 0); Printer.Canvas.LineTo(0, 0); Printer.Canvas.LineTo(0, P.Y); { Imprime um texto na posição 20mm,30mm } P := mm2px(20, 30); Printer.Canvas.TextOut(P.X, P.Y, '20mm, 30mm'); { Imprime um texto na posição 20mm, 50mm } P := mm2px(20, 50); Printer.Canvas.TextOut(P.X, P.Y, '20mm, 50mm'); { Imprime um texto na posição 3cm, 4cm } P := cm2px(3, 4); Printer.Canvas.TextOut(P.X, P.Y, '3cm, 4cm'); { Desenha um retângulo de 4cm X 2cm } R.TopLeft := cm2px(8, 8); R.BottomRight := cm2px(12, 10); Printer.Canvas.Rectangle(R); finally Printer.EndDoc; end; end; ------------------------- Fim do exemplo -------------- > É hiper trabalhoso, e não tem preview. isto voce terá que fazer na mão > Walter Alves Chagas Junior Quanto a esta afirmação, o que tenho a dizer é o seguinte: - Realmente fazer preview é bem trabalhoso. Talvez a maior encrenca seria montar o esquema de paginação, etc e tal. Quanto ao posicionamento dos elementos na tela, o procedimento é semelhante ao mostrado acima, considerando-se a resolução da tela (não estou falando em 640x480, 800x600, etc... estou falando em "pontos por polegada"). Muitas vezes, porém o preview é desnecessário. - Com relação à questão da impressão ser ou não trabalhosa, isto depende muito das rotinas que você tenha para trabalhar. Se quiser fazer todas as conversões diretamente no código principal, onde emite a nota, realmente terá uma grande bagunça, mas se criar funções e classes adequadas para fazer o tratamento "chato" da impressão, então tudo ficará bastante fácil. Na minha opinião realmente o "x da questão" está somente no preview, pois este teria que ser construído caso se deseja. Mas também é um trabalho que seria feito apenas uma vez e usado em muitas situações semelhantes. Atenciosamente. Daniel P. Guimarães Tecnobyte Informática www.tecnobyte.com.br -- <<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>> Para ver as mensagens antigas, acesse: http://br.groups.yahoo.com/group/delphi-br/messages Para falar com o moderador, envie um e-mail para: [EMAIL PROTECTED] ou [EMAIL PROTECTED] Yahoo! Grupos, um serviço oferecido por: ------------------------------------------------------------------------------ Links do Yahoo! Grupos a.. Para visitar o site do seu grupo na web, acesse: http://br.groups.yahoo.com/group/delphi-br/ b.. Para sair deste grupo, envie um e-mail para: [EMAIL PROTECTED] c.. O uso que você faz do Yahoo! Grupos está sujeito aos Termos do Serviço do Yahoo!. [As partes desta mensagem que não continham texto foram removidas] -- <<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>> Para ver as mensagens antigas, acesse: http://br.groups.yahoo.com/group/delphi-br/messages Para falar com o moderador, envie um e-mail para: [EMAIL PROTECTED] ou [EMAIL PROTECTED] Links do Yahoo! Grupos <*> Para visitar o site do seu grupo na web, acesse: http://br.groups.yahoo.com/group/delphi-br/ <*> Para sair deste grupo, envie um e-mail para: [EMAIL PROTECTED] <*> O uso que você faz do Yahoo! Grupos está sujeito aos: http://br.yahoo.com/info/utos.html