Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   Alineacion de valores numericos en Printer (https://www.clubdelphi.com/foros/showthread.php?t=11704)

JOMABRI 22-06-2004 23:21:07

Alineacion de valores numericos en Printer
 
Hola foro,

Estoy imprimiendo valores numericos en el printer.canvas utilizando FormatFloat con textOut. Pero al imprimir me salen asi:

12,789.23
1,185.00
186.00
10.56

que funcion hay o que debo hacer para que salgan alineados o justificados a la derecha???


Gracias.

jachguate 23-06-2004 01:19:18

Dado el método que estas usando para imprimir, lo único que te queda es justificarlos vos a mano.

Para conseguirlo, has de fijar la posición derecha de los valores a una coordenada, averiguar el tamaño que tendrán ya impresos (en pixels) con el método TextWidth del Canvas y luego calcular en base a esto la posición donde imprimirlo.

Creo que me he enrollado un poco, y un trozo de código dice mas que mil palabras

Código Delphi [-]
  Canvas.Font.Pitch = 'Helvetica';
  Canvas.Font.Width = -11;
  PosX := 150 - Canvas.TextWidth('12,789.23');
  Canvas.TextOut(PosX, 50, '12,789.23');

Hasta luego.

;)

Ruben_Cu 23-06-2004 03:50:19

Hola muchachos, en realidad imprimir directo sobre el Canvas del TPrinter a veces es bastante laborioso la propuesta de roman puede solventar este caso, sin embargo quería aclarar que las dos primeras declaraciones presentan dificultades debido a que:
Código:

Canvas.Font.Pitch = 'Helvetica';
no puede correr ya que al Pich se asocia el TFontPitch y no un string que es este caso es el nombre de un tipo de letra.
Y
Código:

Canvas.Font.Width = -11;
le sucede otro tanto ya que para el TFont no existe la propiedad Width.
Al menos ha sido así hasta Delphi 6, no obstante considero una buena propuesta de solución al caso.
Saludos

jachguate 23-06-2004 03:58:08

Cita:

Empezado por Ruben_Cu
la propuesta de roman

Hola Ruben... no se si me perdí de algo, pero creo que estas hablando de mi propuesta... jachguate y no de la de roman... :p

Ciertamente he dejado los errores que has resaltado. He cometido el error de hablar de memoria sin comprobar lo que digo, y ya ves, mi memoria no es confiable... :p

El código debiera ser algo como:

Código Delphi [-]
  Canvas.Font.Name = 'Arial';
  Canvas.Font.Size = -11;
  PosX := 150 - Canvas.TextWidth('12,789.23');
  Canvas.TextOut(PosX, 50, '12,789.23');

Gracias por la aclaración, y hasta luego.

;)

Ruben_Cu 23-06-2004 04:24:04

Buenas noches jachguate, como ves no solo a ti te traiciona la memoria :) pués escribí el nombre equivocado, había acabado de leer un post de roman y allá salió el nombre, ya veo las enmiendas que has hecho y yo tambíén enmiendo mi error por abusar de mis ya viejas neuronas, que entre ron y tabaco van muriendo. ;)
Un saludo

eber 28-07-2004 02:17:08

Otra alternativa
 
Hola, me hice esta funcion para poder alinear a la derecha, fijate si te sirve:

function ubica(s: string):integer;
var aux: byte;
begin
aux:= 8 - length(s);
ubica:= 25 * aux;
end;


Nota: cadena de hasta 8 caracteres.

Ejemplo de llamada:
TextOut ( (2090+ubica(label1.caption)), 1675, label1.caption);

Salutes!

jachguate 28-07-2004 05:45:46

Que significa el factor 25 que utilizas?

Has considerado que pasa con cadenas largas y tipos de fuente no monospace?

eber 28-07-2004 06:58:49

Bueno , esa funcion me sirvio a mi para alinear precios de unos productos que no superaban a 99.999,99. Por eso el 8 y no probe con strings con espacios.
El factor 25 es el ancho aproximado de un caracter. (Usando printer.canvas)

jachguate 28-07-2004 07:42:07

Cita:

Empezado por eber
que no superaban a 99.999,99. Por eso el 8

length('99.999,99') = 9, no 8

Cita:

Empezado por eber
El factor 25 es el ancho aproximado de un caracter. (Usando printer.canvas)

En todo caso, eso dependerá del tipo de letra y el tamaño elegido. Por ello he usado la función TextWidth, del canvas, que te devuelve el ancho exacto de cualquier cadena tomando en cuenta estas variables.

Hasta luego.

;)

eber 28-07-2004 07:57:24

No uso separadores de miles, perdon: 99999,99 = 8
Gracias por el dato TextWidth

Salutes

iotegi 27-07-2005 11:10:26

me funciona conrrectamente, pero si el string es muy largo se me corta, como puedo hacer para que me haga saltos de linea cuando llegue al borde del canvas?

jachguate 27-07-2005 17:55:27

Un canvas es una superficie de dibujo. Así, es tarea tuya determinar si la cadena no puede dibujarse completa (valiendote del textwidth ya mencionado, por ejemplo), cortarla adecaudamente y dibujar el resto en la siguiente "línea", (cuyas coordenadas también tendrás que calcular).

Hasta luego.

;)


La franja horaria es GMT +2. Ahora son las 10:22:05.

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