[Lazarus-es] Ancho en caracteres en lazreport

Jesus Reyes jesusrmx en yahoo.com.mx
Dom Oct 9 02:17:33 CEST 2011



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




More information about the Lazarus-es mailing list