25 septiembre 2007

La barra de estado

Es raro encontrar una aplicación que no lleve en alguno de sus formularios la barra de estado. Hasta ahora he utilizado ejemplos sencillos de meter texto en la barra de estado de manera normal, pero el componente StatusBar permite meter múltiples paneles dentro de la barra de estado e incluso podemos cambiar el formato de la fuente en cada uno de ellos.

ESCRIBIENDO TEXTO SIMPLE

El componente de la clase TStatusBar tiene dos estados: uno para escribir texto simple en un sólo panel y otro para escribir en múltiples paneles. Supongamos que el componente de la barra de estado dentro de nuestro formulario de llama BarraEstado. Para escribir en un sólo panel se hace de la siguiente manera:

BarraEstado.SimplePanel := True;
BarraEstado.SimpleText := 'Texto de prueba';

Se puede escribir tanto texto como longitud tenga la barra de estado, o mejor dicho, tanto como sea la longitud del formulario.

ESCRIBIENDO TEXTO EN MULTIPLES PANELES

Para escribir en múltiples paneles dentro de la misma barra de estado hay que crear un panel por cada apartado. En este ejemplo voy a crear en la barra de estado tres paneles y en cada uno de ellos voy a poner un formato diferente.

begin
BarraEstado.SimplePanel := False;
BarraEstado.Panels.Clear;

with BarraEstado.Panels.Add do
begin
Text := 'x=10';
Width := 50;
Style := psOwnerDraw;
Alignment := taRightJustify;
end;

with BarraEstado.Panels.Add do
begin
Text := 'y=50';
Width := 50;
Style := psOwnerDraw;
Alignment := taRightJustify;
end;

with BarraEstado.Panels.Add do
begin
Text := 'Texto seleccionado';
Style := psText;
Width := 50;
end;
end;

La propiedad Style de cada panel determina si es psText o psOwnerDraw. Por defecto todos los paneles que se crean tiene el estilo psText (texto normal). Si elegimos el estilo psOwnerDraw significa que vamos a ser nosotros los encargados de dibujar el contenido del mismo. Ello se hace en el evento OnDrawPanel de la barra de estado:

procedure TFormulario.BarraEstadoDrawPanel( StatusBar: TStatusBar; Panel: TStatusPanel; const Rect: TRect );
begin
case Panel.ID of
0: with BarraEstado.Canvas do
begin
Font.Name := 'Tahoma';
Font.Size := 10;
Font.Style := [fsBold];
Font.Color := clNavy;
TextOut( Rect.Left + 2, Rect.Top, Panel.Text );
end;

1: with BarraEstado.Canvas do
begin
Font.Name := 'Tahoma';
Font.Size := 10;
Font.Style := [fsBold];
Font.Color := clRed;
TextOut( Rect.Left + 2, Rect.Top, Panel.Text );
end;
end;
end;

Cuando se van creando paneles dentro de una barra de estado, a cada uno de ellos se le va asignado la propiedad ID a 0, 1, 2, etc, la cual es de sólo lectura. Como puede verse en el evento OnDrawPanel si el ID es 0 lo pinto de azul y si es 1 de rojo. Pero sólo funcionará en aquellos paneles cuyo estilo sea psOwnerDraw. Quedaría de la siguiente manera:


También puede cambiarse en cada panel propiedades tales como el marco (bevel), la alineación del texto (alignment) y el ancho (width).

Esto nos permitirá informar mejor al usuario sobre el comportamiento de nuestra aplicación en tiempo real y de una manera elegante que no interfiere con el contenido del resto del formulario.

Pruebas realizadas en Delphi 7.

Publicidad