Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Impresión
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-01-2005
Avatar de BlueSteel
[BlueSteel] BlueSteel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Concepción - Chile
Posts: 2.310
Poder: 23
BlueSteel Va por buen camino
Question 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)

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...
__________________
BlueSteel
Responder Con Cita
  #2  
Antiguo 13-01-2005
Coco Coco is offline
Miembro
 
Registrado: jul 2004
Ubicación: Argentina
Posts: 83
Poder: 20
Coco Va por buen camino
quizas esta funcion pueda ayudarte

canvas.TextExtent
saludos
Responder Con Cita
  #3  
Antiguo 13-01-2005
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
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.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.

Última edición por marcoszorrilla fecha: 13-01-2005 a las 18:21:05.
Responder Con Cita
  #4  
Antiguo 18-01-2005
Avatar de BlueSteel
[BlueSteel] BlueSteel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Concepción - Chile
Posts: 2.310
Poder: 23
BlueSteel Va por buen camino
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...
__________________
BlueSteel
Responder Con Cita
  #5  
Antiguo 19-01-2005
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
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.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 16:32:23.


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
Copyright 1996-2007 Club Delphi