Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   Imprimir en cierta posición con el Canvas (https://www.clubdelphi.com/foros/showthread.php?t=17562)

BlueSteel 13-01-2005 14:45:17

Imprimir en cierta posición con el Canvas
 
Hola...

Necesito realizar una impresión de unos tickets.. en una impresora Laser.. y me gustaria saber como se calcula la posición dentro de un formulario... esto es que debo imprimir en una hoja de tickets 10 por hoja... (2 columnas de 5 filas cada una) :p

los datos a imprimir son
Nombre ; Ficha ; Valido ; Folio

Estoy usando Letra Arial, tamaño 12 :(

al usar Canvas.TextOut(650,350,vNom.Text); que equivalencia tienen en milimetros... :confused:

Coco 13-01-2005 15:38:35

quizas esta funcion pueda ayudarte

canvas.TextExtent
saludos

marcoszorrilla 13-01-2005 16:02:17

El problema es que la función Canvas, maneja Pixels y dependiendo de la impresora, incluso de la configuración de una concreta las posiciones varían, es decir puedes configurar la posición del texto a 10 pixels del márgen izquierdo, pero dependiendo de la longitud de lienzo que tenga la impresora en cuestión luego lo trasladas a otra y las medidas no te servirán.

Código Delphi [-]
 unit Unit1;
 
 interface
 
 uses
   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
   StdCtrls,Printers;
 
   var
   XPixelsParPouce:Integer;
   YPixelsParPouce:Integer;
   function Millimetres2PixelsX(Millims: integer): integer;
   function Millimetres2PixelsY(Millims: integer): integer;
 type
   TForm1 = class(TForm)
     Button1: TButton;
     procedure Button1Click(Sender: TObject);
   private
     { Private declarations }
   public
 
     { Public declarations }
   end;
 
 var
   Form1: TForm1;
 
 implementation
 
 {$R *.DFM}
 
 procedure TForm1.Button1Click(Sender: TObject);
 begin
 //Obtener los pixels por pulgada del Canvas de la impresora
 XPixelsParPouce := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
 YPixelsParPouce := GetDeviceCaps(Printer.Handle, LOGPIXELSY);
 //Pasarlos a milímetros
 Millimetres2PixelsY(YPixelsParPouce);
 Millimetres2Pixelsx(YPixelsParPouce);
 
 end;
 
 
 //Las Funciones que operan la transformación
 
 function Millimetres2PixelsX(Millims: integer): integer;
 begin
  result := Trunc(Millims / (25.4 / XPixelsParPouce));
 end;
 
 function Millimetres2PixelsY(Millims: integer): integer;
 begin
  result := Trunc(Millims / (25.4 / YPixelsParPouce));
 end;
 end.

Explicación está en francés, pero ahora no tengo tiempo de traducirlo, a ver si a la tarde tengo un rato:
Cita:

Maintenant, si nous voulons travailler en millimètres pour plus de commodités, nous devons transformer nos coordonnées en millimètres. Comme vous le savez certainement, 1 pouce = 25.4 mm, donc 1 mm = 1 / 25.4 pouce. Nous pouvons donc calculer directement:

Puisque nous savons maintenant qu'un pouce réel équivaut à un certain nombre de pixels (XPixelsParPouce), nous pouvons facilement déterminer la valeur d'un pixel en millimètres.

1 pouce = XPixelsParPouce = 25.4 mm ==> 1 pixel = 25.4 / XPixelsParPouce

A partir de là, on peut écrire 2 fonctions simples pour transformer les millimètres que nous connaissons en pixels reconnus par notre imprimante:

Pour obtenir le nombre de pixels par pouce pour l'imrimante, nous écrirons donc:
Cita:

Ahora, si queremos trabajar en milímetros para más comodidad, debemos transformar nuestras coordenadas en milímetros. Como ciertamente ya sabéis 1 pulgada = 25,4 mm, por lo tanto 1mm=1 / 25.4 pulgadas. Podemos por lo tanto calcular directamente:

Puesto que ahora sabemos que una pulgada real equivale a un cierto número de pixels (XpixelsParPouce), podemos fácilmente determinar el valor de un pixel en milímetros.


1 Pulgada = XPixelsParPouce = 25.4 mm ==> 1 pixel = 25.4 / XpixelsParPouce.

A partir de aquí podemos crear 2 funciones simples para transformar los milímetros que sabemos que nuestra impresora reconoce en pixels.

Para obtener el número de pixels por pulgada de la impresora escribiremos:
Un Saludo.

BlueSteel 18-01-2005 23:51:58

Que lata...

tenia el informe listo... de la siguiente forma.. para una HP4100 .. y ahora me cambian la impresora a una HP692C.... y sale todo descuadrado.....

BeginDoc;
Canvas.Font.Size:=12;
Canvas.Font.Name:='Arial';

// Imprimo la Primera Fila (2 Columnas )
Canvas.TextOut(0650,750,vNom.Text);
Canvas.TextOut(2500,750,vNom.Text);
Canvas.TextOut(0650,1000,vFic.Text);
Canvas.TextOut(2500,1000,vFic.Text);
Canvas.TextOut(2000,1000,'Dic-'+nAnno);
Canvas.TextOut(3850,1000,'Dic-'+nAnno);
Canvas.TextOut(2050,1250,IntToStr(Cont));
Cont := Cont +1;
Canvas.TextOut(3850,1250,IntToStr(Cont));
Cont := Cont +1;

// Imprimo la Segunda Fila (2 Columnas )
Canvas.TextOut(0650,1950,vNom.Text);
Canvas.TextOut(2500,1950,vNom.Text);
Canvas.TextOut(0650,2200,vFic.Text);
Canvas.TextOut(2500,2200,vFic.Text);
Canvas.TextOut(2000,2200,'Dic-'+nAnno);
Canvas.TextOut(3850,2200,'Dic-'+nAnno);
Canvas.TextOut(2050,2450,IntToStr(Cont));
Cont := Cont +1;
Canvas.TextOut(3850,2450,IntToStr(Cont));
Cont := Cont +1;

// Imprimo la Tercera Fila (2 Columnas )

// Imprimo la Cuarta Fila (2 Columnas )

// Imprimo la Quinta Fila (2 Columnas )


EndDoc;

Que lata que tenga que pegarme nuevamente la tarea de reprogramar esto...

marcoszorrilla 19-01-2005 14:47:33

Como te decía depende de la impresora en cuestión incluso la misma si se trabaja a mas ó menos resolución te descuadra.

Yo el arreglo que le doy a esta situación es crear un fichero de configuración, una Tabla, ahí guardo el tamaño y tipo de letra a utilizar, y las posiciones, filas y columnas de los distintos campos, un poco tedioso, pero luego desde le programa con una opción en la que se muestran todas estas posiciones bien documentadas, un simple cambio de impresora no te obligará a desplazarte, a no ser que el usurio sea un torpe, que también puede ser, pero en cualquier caso no hay que tocar el codigo para nada.

La posición 10, ahora puede que sea 40, otra cosa yo también configuro el salto de línea para poder separar más o menos éstas, también lo guardo en esa tabla.

Un Saludo.


La franja horaria es GMT +2. Ahora son las 02:22:18.

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