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

 



Responder a