> 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

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