PDA

Ver la Versión Completa : Alineacion de valores numericos en Printer


JOMABRI
22-06-2004, 23:21:07
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


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:
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
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
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:


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
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
que no superaban a 99.999,99. Por eso el 8

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

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.

;)