Colocando um ProgressBar em um StatusBar

Veja neste artigo, como colocar um ProgressBar em um painel do componente StatusBar.

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

Ebook exclusivo
Dê um upgrade no início da sua jornada. Crie sua conta grátis e baixe o e-book

Artigos relacionados