Delphi: Colocando um ProgressBar em um StatusBar

0

Posted on : 11-12-2012 | By : Paulo H Oliveira | In : Delphi

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.

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).

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;

Fonte:
Leia mais em: Colocando um ProgressBar em um StatusBar
http://www.devmedia.com.br/colocando-um-progressbar-em-um-statusbar/1368#ixzz2Elu1ueWM

Compartilhe :

  • Stumble upon
  • twitter

Escreva um comentário

Security Code: