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