Na verdade tem muito tempo que nao mexo com o TPrinter, era ainda nos tempos do Delphi 2. Pode at� ser que de l� pra c� eles mudaram isto, mas eu lembro que antes era em milimetros porque eu vivia tendo problemas para gerar relat�rios cont�nuos em formul�rios de 80 colunas
[]s Walter Alves Chagas Junior Projeto e desenvolvimento Telemont Engenharia de telecomunica��es [EMAIL PROTECTED] Fone: (31) 3389-8215 Fax: (31) 3389-8200 > -----Mensagem original----- > De: Daniel / Tecnobyte [mailto:[EMAIL PROTECTED] > Enviada em: quinta-feira, 28 de outubro de 2004 13:09 > Para: [EMAIL PROTECTED] > Assunto: 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] > > Links do Yahoo! Grupos > > > > > > > > [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

