PDA

Ver la Versión Completa : Problema con TStatusBar


J.Slann
18-06-2012, 16:32:23
Hola,

Mi programa tiene una barra de estado del tipo TStatusBar. La barra contiene a su vez cinco paneles de informacion del tipo TStatusPanel. La anchura de la barra se ajusta según el tamaño de la ventana del programa, de esta manera, la barra de estado es tan ancha como lo es la ventana principal del programa. Los cuatro primeros paneles tienen una anchura fija.

El problema aparece con el quinto panel. Este quinto panel no posee una anchura fija y se ajusta para completar lo que falta de ancho hasta completar el ancho de la ventana principal. En ese quinto panel tengo que escribir cierta información, la información es un texto normal que se guarda en la propiedad "text" del panel. Para escribir el texto utilizo:
Statusbar1.Panels[4].Text:='Aqui va el texto';
A veces la cadena es muy larga y en esos casos aparece el problema. La cadena no se escribe entera en el panel. Esto ocurre aunque en ese panel aún quede anchura para ocupar la cadena entera. Quiero decir que aunque el cajetin es grande, la cadena no se escribe hasta completar toda la anchura del panel, quedando esteticamente feo y perdiendo información. Es como si existiera una limitación que no me deja representar más de X caracteres aún quedando espacio para ellos.

¿Como puedo conseguir lo que quiero?
¿Existe ciertamente una limitación? He considerado que no debe existir esa limitación porque la propiedad "text" está declarada como un string.

Gracias y un saludo.

roman
18-06-2012, 17:41:44
Si no has cambiado nada en el comportamiento del StatusBar, no deberías tener este problema. ¿Podrías mostrar una imagen de cómo queda el problema?

// Saludos

J.Slann
18-06-2012, 17:56:12
No he cambiado nada (o al menos intencionadamente), me puedes indicar que propiedades compruebo?

Aquí subo la foto:
http://img269.imageshack.us/img269/458/statuspanle.png

Gracias por tu respuesta.

Saludos

Casimiro Notevi
18-06-2012, 22:15:13
¿Y el texto es más largo de lo que aparece ahí?

J.Slann
19-06-2012, 03:27:55
Si claro, el texto es más largo, y como veis no aparece entero.

A la izquierda de ese panel existen otros paneles (de tamaño fijo)

MartinS
19-06-2012, 03:49:44
Hola J.: Lo que podrias hacer es adecuar el ancho del ultimo panel de acuerdo al tamaño general del StatusBar.

Por ejemplo cuando vos creas los paneles todos tienen un tamaño fijo predeterminado en 50. Si tenes los 4 primeros paneles en 50, por ejemplo hagamos un par de cuentas: 4 X 50 = 200 entonces el tamaño del 5° panel va a ser del tamaño total del StatusBar menos los cuatro primeros.
Podes verificar esto en el evento OnResize del Form

procedure TForm1.FormResize(Sender: TObject);
begin
StatusBar1.Panels[4].Width := StatusBar1.Width-200;
StatusBar1.Panels[4].Text := Edit1.Text;
ShowMessage('Ancho de panel: '+IntToStr(StatusBar1.Panels[4].Width));
end;


Asi vas a poder utilizar todo el espacio restante del statusBar asignandolo al 5.

Saludos y espero que te sirva eso. Obviamente la limitacion va a estar dada por el tamaño de fuente y la cantidad de texto, no?

ecfisa
19-06-2012, 04:58:18
Si claro, el texto es más largo, y como veis no aparece entero.
Hola J.Slann.

Tenes razón... cuando el TStatusPanel tiene su propiedad Style igual a psText deja un espacio significativo sin ocupar y realmente no sé el motivo de ese comportamiento.

Pero dibujándolo manualmente, logré que el texto ocupe todo el ancho del Panel:

...
implementation

const // constante literal, máximo 255 caracteres
TEXTO = 'Mi programa tiene una barra de estado del tipo TStatusBar.' +
'La barra contiene a su vez cinco paneles de informacion del ' +
'tipo TStatusPanel. La anchura de la barra se ajusta según el ' +
'tamaño de la ventana del programala barra de estado es tan ancha como lo es';

procedure TForm1.FormCreate(Sender: TObject);
begin
with StatusBar1.Panels[4] do
begin
Style:= psOwnerDraw;
Text:= TEXTO;
end;
end;

procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar; Panel: TStatusPanel; const Rect: TRect);
begin
if Panel.Index = 4 then
StatusBar.Canvas.TextRect(Rect, Rect.Left, Rect.Top, TEXTO);
end;


Saludos.

roman
19-06-2012, 06:33:25
En realidad no es que deje un espacio. Más bien parece que, efectivamente, el texto está limitado a 127 caracteres:

In Windows XP and earlier, the text for each part is limited to 127 characters. This limitation has been removed in Windows Vista.

Y para que en Vista muestre más de 127 caracteres, es necesario incluir un XPManifest si estamos usando Delphi 7. En otros casos habrá que proceder como indica ecfisa.

// Saludos

J.Slann
19-06-2012, 19:28:11
Gracias por las respuestas.

Efectivamente el problema era que se limitaba el espacio a 127 caracteres.
He hecho lo que indicaba ecfisa y ya me funciona bien.

Saludos