[Lazarus-es] Ancho en caracteres en lazreport

Antonio Évora aevorar en gmail.com
Lun Oct 3 15:47:35 CEST 2011


Hola a todos,
Estoy creando una clase usando como base lazreport para que me genere 
listados al vuelo. Para calcular el ancho y alto del texto utilizo los 
siguientes métodos:

function TListado.FontTextWidth(aText: string; aFont: TFont): integer;
var
   TempBMP: TBitmap;
begin
   TempBMP:=TBitmap.Create;
   try
     TempBMP.Canvas.Font.Assign(aFont);
     Result:=TempBMP.Canvas.TextWidth(aText);
   finally
     TempBMP.Free;
   end;
end;

function TListado.FontTextHeight(aText: string; aFont: TFont): integer;
var
   TempBMP: TBitmap;
begin
   TempBMP:=TBitmap.Create;
   try
     TempBMP.Canvas.Font.Assign(aFont);
     Result:=TempBMP.Canvas.TextHeight(aText);
   finally
     TempBMP.Free;
   end;
end;

Siendo el parametro afont el mismo que le asigno a los componentes 
TfrMemoView. Pero al usar el ancho y el alto calculado no se ve 
correctamente.

Para que se vea correctamente debo modificar los métodos anteriores y 
hacerlo asi:

function TListado.FontTextWidth(aText: string; aFont: TFont): integer;
var
   TempBMP: TBitmap;
begin
   TempBMP:=TBitmap.Create;
   try
     TempBMP.Canvas.Font.Assign(aFont);
     Result:=TempBMP.Canvas.TextWidth(aText)+2; //Añado 2 al ancho
   finally
     TempBMP.Free;
   end;
end;

function TListado.FontTextHeight(aText: string; aFont: TFont): integer;
var
   TempBMP: TBitmap;
begin
   TempBMP:=TBitmap.Create;
   try
     TempBMP.Canvas.Font.Assign(aFont);
     Result:=TempBMP.Canvas.TextHeight(aText);
     //Si el tamaño del texto es mayor que 8
     if aFont.Size>8 then
     begin
       //Esta formula es resultado de varias pruebas (y errores)
       Result:=Result+((aFont.Size-8) div 2);
     end;
   finally
     TempBMP.Free;
   end;
end;

Uso Lazarus en Windows XP, alguna sugerencia de como lazreport usas las 
coordenadasd y medidas pues despues de leer la documentacion (de 
freereport) que dice que todo es en pixeles pero no coincide el 
resultado esperado con los calculos realizados.

Si os es necesario os adjunto la unidad con el código completo.

Un cordial saludo y gracias anticipadas.




More information about the Lazarus-es mailing list