Ver Mensaje Individual
  #1  
Antiguo 27-01-2009
Avatar de Faust
Faust Faust is offline
Miembro
 
Registrado: abr 2006
Ubicación: México D.F.
Posts: 930
Reputación: 19
Faust Va por buen camino
Question 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 ... 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...
__________________
Herr Heins Faust
Responder Con Cita