[Lazarus-es] Ancho en caracteres en lazreport

Antonio Évora aevorar en gmail.com
Jue Oct 20 13:10:04 CEST 2011


El 09/10/11 02:17, Jesus Reyes escribió:
>
> --- El vie 7-oct-11, Antonio Évora<aevorar en gmail.com>  escribió:
>
>
>> Hola Jesús,
>> Te acabo de enviar las fuentes a tu correo.
>>
>> Un saludo y gracias.
>>
> Parece ser un problema de escala, tu rutina calcula bien el ancho, pero en preview LazReport utiliza un factor de aspecto tomando como referencia las dimensiones del papel seleccionado en la impresora y las características de la pantalla, este factor se utiliza para calcular un mejor tamaño de fuente.
>
> En este caso como calcula una fuente de menor tamaño "caben" mas caracteres de los que se calcularon originalmente, provocando como consecuencia, el problema que reportas. La solución calcular de forma mas precisa el tamaño de fuente como se vería en preview, esto se hace calculando el font.height.
>
> Puede parecer extraño que para poder calcular el ancho en pixeles de una cadena se tenga que calcular el font.heigh, pero si no se hace así, el tamaño de fuente basado en puntos no es lo suficientemente preciso al momento de escalar, por eso se utiliza font.height el cual se basa en pixeles.  Su cálculo toma en cuenta el font.size especificado y el factor que llamemos "de preview", a continuación una modificación de tu rutina tomando en cuenta estos factores...
>
> function TListado.FontTextWidth(aText: string; aFont: TFont): integer;
> var
>    TempBMP: TBitmap;
>    Info: TfrPrnInfo;         //JRA
>    sy: double;               //JRA
> begin
>    prn.FillPrnInfo(Info);    //JRA
>    sy := Info.ph/Info.pgh;   //JRA
>    TempBMP:=TBitmap.Create;
>    try
>      TempBMP.Canvas.Font.Assign(aFont);
>      TempBMP.Canvas.Font.Height := -round(aFont.Size*96/72*sy); // JRA
>      Result:=TempBMP.Canvas.TextWidth(aText)+2;//El dos es por las dos lineas del frame por su ancho
>    finally
>      TempBMP.Free;
>    end;
> end;
>
> La modificación supone que se ha llamado a frReporte.ChangePrinter antes, como haces en alguna parte de tu código. También, ten en cuenta que el ancho devuelto incluye únicamente el texto y no los espacios para justificar a la izquierda, centro y derecha dentro del área del memo, así como los anchos de línea del marco. Ambas cosas también son escaladas en preview lo que pasa a complicar un poco mas el cálculo exacto pero que seguramente puedas ajustar manualmente, como esos 2 pixeles añadidos en tu código original.
>
> Pruébalo a ver como te resulta.
>
> Jésus Reyes A.
>
> _______________________________________________
> Lazarus-es mailing list
> Lazarus-es en lists.lazarus.freepascal.org
> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es
Estimado Jesús,
Primeramente perdón por el retraso pero he tenido problemas con las 
revisiones de Lazarus :-).
Acabo de modificar el método y ahora es espacio es mas pequeño por lo 
que se ajusta mas al resultado esperado. Pero el último carácter aparece 
un poco cortado, utilizo la siguiente instrucción para calcular el ancho:

Ancho:=FontTextWidth(DupeString('A',strtoint(FInfoListado.Anchos[n-1])),FInfoListado.FontDetail);

¿Como tendría que hacerlo para cuadrarlo como "debe de ser"? Y ya 
puestos, ¿como cuadrar bien también el alto?

La verdad es que seria bastante interesante que el poder trabajar con 
caracteres lo incluyera LazReport de "serie" como hacia QuickReport. 
¿Que opináis?

Un cordial saludo y gracias de antemano.




More information about the Lazarus-es mailing list