Colocando um ProgressBar em um StatusBar
Neste artigo, veremos como adicionar uma barra de estado (ou qualquer outro componente Delphi) à barra de progresso. Disponibilizando visualização de operações de aplicação prolongadas, na área de estado de um formulário Delphi.
A maioria das aplicações fornece uma área no formulário principal da aplicação, normalmente alinhada na parte inferior do formulário, utilizada para exibir informações sobre a mesma, enquanto está rodando.
Um StatusBar (situado na paleta Win32) pode ser utilizado para acrescentar uma barra de estado a um formulário. A propriedade Panels de um StatusBar é utilizada para adicionar, remover ou modificar os painéis do status bar (cada painel é representado por um objeto TStatusPanel).
Um ProgressBar (situado na paleta Win32) exibe uma barra de progresso simples. Barras de progresso proporcionam aos usuários visualização sobre o progresso de um procedimento dentro de uma aplicação.
Figura 1. Componentes da paleta Win32
ProgressBar em StatusBar
Quando colocada automaticamente em um formulário, o StatusBar se alinha na parte inferior (propriedade Align = alBottom). Inicialmente tem apenas um painel. Veremos como acrescentar painéis à coleção de painéis (uma vez que uma barra de estado foi acrescentada a um formulário, digamos com o nome padrão StatusBar1).
Damos um duplo clique no componente status bar para abrir o editor de painéis. Clicamos de direita no editor de painéis e selecionamos Add, isto adiciona um TStatusPanel à coleção de painéis. Adicionamos mais um. Selecionamos o primeiro painel e utilizando o Object Inspector, designamos “Progresso:” para a propriedade Text.
Nota: Iremos colocar uma barra de progresso no segundo painel!
Fechamos o editor de painéis. Para exibir uma barra de progresso dentro do painel da barra de progresso, precisamos antes de um ProgressBar. Colocamos um no formulário e deixamos o nome padrão (ProgressBar1).
Figura 2. Formulário do exemplo
A seguir, veremos o que precisa ser feito para que o ProgressBar seja exibido dentro de um StatusBar. Atribuiremos StatusBar1 para a propriedade Parent do ProgressBar1 (em tempo de execução). Mudaremos a propriedade Style do segundo painel para psOwnerDraw.
Quando atribuído psOwnerDraw, o conteúdo exibido no painel de estado é desenhado em tempo de execução, no Canvas da barra de estado via código do evento manipulador OnDrawPanel. Em contraste com o psOwnerDraw, o valor padrão de psText, garante que a string contido na propriedade Text, será exibido no painel de estado, utilizando o alinhamento especificado pela propriedade Align. Tratamos o evento OnDrawPanel do StatusBar, adicionando o código que alinha a barra de progresso em um painel de uma barra de estado.
Os primeiros dois passos vistos no item anterior, são finalizados no evento manipulador OnCreate do Formulário.
procedure TForm1.FormCreate(Sender: TObject);
var
ProgressBarStyle: integer;
begin
StatusBar1.Panels[1].Style := psOwnerDraw;
ProgressBar1.Parent := StatusBar1;
ProgressBarStyle := GetWindowLong(ProgressBar1.Handle,
GWL_EXSTYLE);
ProgressBarStyle := ProgressBarStyle - WS_EX_STATICEDGE;
SetWindowLong(ProgressBar1.Handle, GWL_EXSTYLE,
ProgressBarStyle);
end;
Nota: O ProgressBar tem uma borda padrão não muito agradável quando o componente é colocado na barra de estado, portanto, decidimos remover a borda.
Finalmente, tratamos o evento OnDrawPanel do StatusBar1:
procedure TForm1.StatusBar1DrawPanel(
StatusBar: TStatusBar;
Panel: TStatusPanel;
const Rect: TRect);
begin
if Panel = StatusBar.Panels[1] then
with ProgressBar1 do
begin
Top := Rect.Top;
Left := Rect.Left;
Width := Rect.Right - Rect.Left - 15;
Height := Rect.Bottom - Rect.Top;
end;
end;
Tudo pronto. Rodar o projeto e com algum código no manipulador de evento OnClick de um botão:
procedure TForm1.Button1Click(Sender: TObject);
var
i : integer;
begin
ProgressBar1.Position := 0;
ProgressBar1.Max := 100;
for i := 0 to 100 do
begin
ProgressBar1.Position := i;
Sleep(25);
//Application.ProcessMessages;
end;
end;
Figura 3. Projeto em execução