Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / lazarus-es / 2011-10

Ancho en caracteres en lazreport

11 messages · 2 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Antonio Évora

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.

Reply by email

Jesus Reyes
to Antonio Évora

--- El lun 3-oct-11, Antonio �vora <aevorar en gmail.com> escribi�:>

Show quoted text 11 lines
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.

En lazreport se utiliza esta formula cuando el reporte se muestra en pantalla (preview).

ACanvas.Font.Height := -Round(Self.Font.Size * 96 / 72 * ScaleY)

Donde ScaleY es el factor de zoom actual. 96 se supone que sean los puntos por pulgada que reporta windows, pero a los creadores de freereport original parece prefirieron utilizar un valor standard en lugar del valor actual, no se bien la causa. Al imprimir utiliza la resolucion de la impresora.

�Qu� es lo que quieres hacer?, Ser�a mejor que hicieras disponible el c�digo fuente, as� podemos darle un vistazo

Jesus Reyes A.

Reply by email

Antonio Évora
to Jesus Reyes

El 06/10/11 16:57, Jes�s Reyes escribi�:

Show quoted text 28 lines
--- El lun 3-oct-11, Antonio �vora<aevorar en gmail.com> escribi�:> > 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. > En lazreport se utiliza esta formula cuando el reporte se muestra en pantalla (preview). ACanvas.Font.Height := -Round(Self.Font.Size * 96 / 72 * ScaleY) Donde ScaleY es el factor de zoom actual. 96 se supone que sean los puntos por pulgada que reporta windows, pero a los creadores de freereport original parece prefirieron utilizar un valor standard en lugar del valor actual, no se bien la causa. Al imprimir utiliza la resolucion de la impresora. �Qu� es lo que quieres hacer?, Ser�a mejor que hicieras disponible el c�digo fuente, as� podemos darle un vistazo Jesus Reyes A. _______________________________________________ Lazarus-es mailing list Lazarus-es en lists.lazarus.freepascal.org http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es

Hola Jes�s,
Primeramente gracias por contestar. Lo que quiero hacer es poder asignar el ancho a un TfrMemoView en runtime determinado por el n�mero de caracteres. Te explico, si uno de los campos de la BBDD es tipo cadena de 10 caracteres poder poner el ancho del componente para que quepan exactamente ese numero de caracteres y poder aprovechar mejor la pagina.

En cuanto al c�digo fuente, �como os lo paso? lo adjunto, lo subo a alg�n sitio.

Un cordial saludo.

Reply by email

Jesus Reyes
to Antonio Évora

--- El jue 6-oct-11, Antonio �vora <aevorar en gmail.com> escribi�:

Show quoted text 10 lines
Primeramente gracias por contestar. Lo que quiero hacer es poder asignar el ancho a un TfrMemoView en runtime determinado por el n�mero de caracteres. Te explico, si uno de los campos de la BBDD es tipo cadena de 10 caracteres poder poner el ancho del componente para que quepan exactamente ese numero de caracteres y poder aprovechar mejor la pagina.

Eso lo puede hacer automaticamente LazReport si has ajustado la propiedad AutoSize a true en el inspector de objetos del dise�ador de reportes.

En cuanto al c�digo fuente, �como os lo paso? lo adjunto, lo subo a alg�n sitio.

Si quieres, puedes enviarlo a mi direccion.

Un cordial saludo.

Jesus Reyes A.

Reply by email

Antonio Évora
to Jesus Reyes

El 06/10/11 19:35, Jes�s Reyes escribi�:

Show quoted text 28 lines
--- El jue 6-oct-11, Antonio �vora<aevorar en gmail.com> escribi�: > Primeramente gracias por contestar. Lo que quiero hacer es > poder asignar > el ancho a un TfrMemoView en runtime determinado por el > n�mero de > caracteres. Te explico, si uno de los campos de la BBDD es > tipo cadena > de 10 caracteres poder poner el ancho del componente para > que quepan > exactamente ese numero de caracteres y poder aprovechar > mejor la pagina. Eso lo puede hacer automaticamente LazReport si has ajustado la propiedad AutoSize a true en el inspector de objetos del dise�ador de reportes. > En cuanto al c�digo fuente, �como os lo paso? lo adjunto, > lo subo a > alg�n sitio. Si quieres, puedes enviarlo a mi direccion. > Un cordial saludo. > Jesus Reyes A. _______________________________________________ Lazarus-es mailing list Lazarus-es en lists.lazarus.freepascal.org http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es

Hola Jes�s,
Te acabo de enviar las fuentes a tu correo.

Un saludo y gracias.

Reply by email

Jesus Reyes
to Antonio Évora

--- El vie 7-oct-11, Antonio �vora <aevorar en gmail.com> escribi�:

Show quoted text 5 lines
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.

Reply by email

Antonio Évora
to Jesus Reyes

El 09/10/11 02:17, Jesus Reyes escribi�:

Show quoted text 43 lines
--- 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

Muchas gracias Jes�s.
Lo pruebo y te cuento.

Un cordial saludo.

Reply by email

Antonio Évora
to Jesus Reyes: --- El vie 7-oct-11, Antonio �vora <aevorar en gmail.com> escribi�: Parece ser un…

El 09/10/11 02:17, Jesus Reyes escribi�:

Show quoted text 43 lines
--- 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.

Reply by email

Jesus Reyes
to Antonio Évora

--- El jue 20-oct-11, Antonio �vora <aevorar en gmail.com> escribi�:

�Como tendr�a que hacerlo para cuadrarlo como "debe de ser"? Y ya

Tal como te comente en el mensaje original, el c�lculo solo incluye el ancho del texto, y no los espacios entre el borde del cuadro al texto ni ancho del marco, los cuales no se como hacer en una sola formula, por lo cual, creo que tendr�s que usar alg�n valor fijo en pixeles, "como lo hac�as en tu c�digo con esos 2 pixeles a�adidos".

Siento no poder proporcionarte algo mas preciso que esto.

puestos, �como cuadrar bien tambi�n el alto?

Usa Canvas.TextHeight, pero tambi�n hay que tener en cuenta espacios y ancho del marco.

Show quoted text 7 lines
La verdad es que seria bastante interesante que el poder trabajar con caracteres lo incluyera LazReport de "serie" como hacia QuickReport. �Que opin�is?

Como nunca use QuickReport, no se a que te refieres, �podr�as explicarlo?

Jesus Reyes A.

Reply by email

Antonio Évora
to Jesus Reyes

Hola Jes�s,

El 20/10/11 19:09, Jesus Reyes escribi�:

Show quoted text 8 lines
--- El jue 20-oct-11, Antonio �vora<aevorar en gmail.com> escribi�: > �Como tendr�a que hacerlo para cuadrarlo como "debe de > ser"? Y ya Tal como te comente en el mensaje original, el c�lculo solo incluye el ancho del texto, y no los espacios entre el borde del cuadro al texto ni ancho del marco, los cuales no se como hacer en una sola formula, por lo cual, creo que tendr�s que usar alg�n valor fijo en pixeles, "como lo hac�as en tu c�digo con esos 2 pixeles a�adidos". Siento no poder proporcionarte algo mas preciso que esto.

Corr�geme si me equivoco: Lo del ancho del marco esta en la propiedad FrameWidth (que habr�a que multiplicar por dos), la otra informaci�n (el espacio entre el borde y el texto) �de donde puedo sacarlo? Siguiendo con mis m�ltiples pruebas, hoy me he dicho, si la propiedad autosize lo cuadra perfecto porque creo un reporte, con su banda y un memoview, a este ultimo le asigno el texto y el autosize a true, llamo al m�todo del reporte PrepareReport y leo a continuaci�n el width. Pero mi gozo en un pozo, el width me dice que es 0.

Show quoted text 10 lines
> puestos, �como cuadrar bien tambi�n el alto? Usa Canvas.TextHeight, pero tambi�n hay que tener en cuenta espacios y ancho del marco. > La verdad es que seria bastante interesante que el poder > trabajar con > caracteres lo incluyera LazReport de "serie" como hacia > QuickReport. > �Que opin�is? > Como nunca use QuickReport, no se a que te refieres, �podr�as explicarlo?

Pues poder decirle al MemoView que su tama�o es de x caracteres, independientemente del tipo de letra usado.
En quickreport el reporte tenia una propiedad llamada units, y uno de los posibles valores era Characters (as� como pixels o mm) con lo que las medidas del componente ir�an en caracteres.

Show quoted text 6 lines
Jesus Reyes A. _______________________________________________ Lazarus-es mailing list Lazarus-es en lists.lazarus.freepascal.org http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es

Reply by email

Antonio Évora
to Jesus Reyes: --- El jue 20-oct-11, Antonio �vora <aevorar en gmail.com> escribi�: Tal como te…

Siguiendo con el tema, he detectado que al cambiar la escala en el preview del reporte no se reescala correctamente. Inicialmente esta con la escala al 100%, si la pongo al 200% se ven menos caracteres y si la pongo al 58% (seleccionado la opci�n "Two Pages") se ven mas.

�No es esto un bug? �No deber�a de verse lo mismo independientemente de la escala, solo con los caracteres mas grandes o peque�os?

Un saludo.

Reply by email