Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   Como imprimir con precisión directamente sobre el Canvas de TPrinter (https://www.clubdelphi.com/foros/showthread.php?t=63046)

Faust 27-01-2009 17:46:48

Como imprimir con precisión directamente sobre el Canvas de TPrinter
 
Saludos camaradas...

Hace un par de semanas desarrollé un par de aplicaciones para imprimir recibos de nómina, como era un poco complicado y no supe como hacerlo en Rave ni en QuickReport me dí a la tarea de hacerlo imprimiendo directamente sobre el Canvas de TPrinter, la cosa es que primero calculo cuantos pixeles son por cm. y despues hago cálculos para enviarlo en la posición correcta en el canvas de la impresora, la cosa es que no es muy preciso que digamos :rolleyes:... así que creo que estoy haciendo algo mal y pido de su ayuda para encontrar donde está el error, pongo un poco de código explicarme mejor:

Código Delphi [-]
var
  PixelsPerCMX, PixelsPerCMY: Real;   //Aquí guardo la relación de pixeles por cm. en el eje X y Y
  MargenX, MargenY: integer;    //Aquí guardo el margen en pixeles del Canvas de la impresora
  X, Y: integer;  // Para guardar la posición de donde se imprimirá
...
// Obtengo la relación de Pixeles por cm. en ambos ejes
PixelsPerCMX:= GetDeviceCaps(Printer.Handle, LOGPIXELSX) / 2.54;
PixelsPerCMY:= GetDeviceCaps(Printer.Handle, LOGPIXELSY) / 2.54; 
// Obtengo el tamaño de los márgenes del Canvas de TPrinter
MargenX:= GetDeviceCaps(Printer.Handle, PHYSICALOFFSETX);
MargenY:= GetDeviceCaps(Printer.Handle, PHYSICALOFFSETY);
...
Printer.BeginDoc;
...
//Imprimo...
X:= Round(PixelsPerCMX * 2.5) - MargenX  // Seteo X a 2.5 cm.
Y:= Round(PixelsPerCMY * 4.2) - MargenY // Seteo Y a 4.2 cm.
Printer.Canvas.TextOut(X, Y, 'Texto a 2.5 cm. del eje X y 4.2 cm. del eje Y');  // Se imprime con precisión
// Con estas medidas se imprime con precisión, pero si aumento X o Y se desfasa mucho p. ej.
X:= Round(PixelsPerCMX * 22.5) - MargenX  // Seteo X a 22.5 cm.
Y:= Round(PixelsPerCMY * 14.2) - MargenY // Seteo Y a 14.2 cm.
Printer.Canvas.TextOut(X, Y, 'Texto a 22.5 cm. del eje X y 14.2 cm. del eje Y');  // Se imprime sin precisión, en el papel de imprime aprox. en 22.3 y 14 cm. ... 2 mm. de diferencia
...
Printer.EndDoc;

Me imagino que algún error me está afectando, no de Printer sino de como convierto las medidas o de algún cálculo (he leído que es posible imprimir directamente sobre el canvas con mucha precisión).

Me gustaría que me orientaran si estoy haciendo bien mi proceso de impresión o si pudieran sugerirme otra manera de hacerlo...

Desde ya muchas gracias...

Faust 28-01-2009 02:11:03

Sigo probando y no logro aumentar la precisión :mad:


La franja horaria es GMT +2. Ahora son las 16:58:48.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi