Classe canvas [TListBox, TCheckListBox, TComboBox]


Pintado imagens no TListBox, TCheckListBox, TComboBox ....

Alguns componentes (TListBox, TComboBox, TStatusBar...), não possuem uma propriedade que liga um item a uma imagem ou ícone. Mas, podemos mostrar essas imagens, “pintando” as mesmas nos componentes, utilizando a classe Canvas.

Em nosso teste vamos precisar de:
  • TListBox 
  • TImageList

No TImageList adicione alguns ícones, já no TListBox coloque "Items" de acordo com a quantidade de imagens, alter a propriedade Style para lbOwnerDrawFixed, e agora no evento OnDrawItem vamos colocar:
procedure TFSistema.ListBoxDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
begin
  ListBox.Canvas.FillRect(Rect);
  ListBox.Canvas.TextOut(Rect.Left+18, Rect.Top, ListBox.Items[Index]);
  ImageList1.Draw(ListBox.Canvas, Rect.Left, Rect.Top, Index);
end;

Esse código vai pegar as imagens que estão no TImageList e colocar em ordem nos Itens do TListBox. O código pode ser adaptado para qualquer componente que utiliza a classe Canvas, mas é mais conhecido no componente TDBGrid 

Exemplo: Download do exemplo

Mostrando a barra de progresso da StatusBar

Em nosso teste vamos precisar de:


Adicione painéis no StatusBar, clicando com o botão direito no componente e escolhendo Panels Editor, apos altere a propriedade Style dos paineis para psOwnerDraw. No evento OnDrawPanel do StatusBar vai o código abaixo.
procedure TFSistema.StatusBar1DrawPanel(StatusBar: TStatusBar; Panel: TStatusPanel; const Rect: TRect);
begin
  if Panel.Index = 0 then begin
    ProgressBar1.Width := Rect.Right - Rect.Left + 1;
    ProgressBar1.Height := Rect.Bottom - Rect.Top + 1;
    ProgressBar1.PaintTo(StatusBar.Canvas.Handle, Rect.Left, Rect.Top);
  end;
end;

Nesse código estamos fazendo um If para apenas passar no processo se for nosso primeiro Painel

Agora no OnClick do botão adicione o código abaixo.
procedure TFSistema.BitBtn1Click(Sender: TObject);
var
  li: integer;
begin
  for li := ProgressBar.Min to ProgressBar.Max do begin
    ProgressBar.Position := li;
    StatusBar1.Repaint;
    Sleep(25);
  end;
  ProgressBar.Position := ProgressBar.Min;
  StatusBar1.Repaint;
end;

No código a cima apenas um laçõ de repetição para poder validar o progresso 

Mostrar ícones nos painéis da StatusBar

procedure TFSistema.StatusBar1DrawPanel(StatusBar: TStatusBar; Panel: TStatusPanel; const Rect: TRect);
begin
  if Panel.Index = 0 then begin
    ....
  end else if Panel.Index = 1 then begin
    StatusBar1.Canvas.FillRect(Rect);
    StatusBar1.Canvas.TextOut(Rect.left + 18, rect.Top, Panel.Text);
    ImageList1.Draw(StatusBar.Canvas,rect.left, rect.top,Panel.Index);
  end;
end;

Nesse trecho mostramos como colocar cor na StatusBar
procedure TFSistema.StatusBar1DrawPanel(StatusBar: TStatusBar; Panel: TStatusPanel; const Rect: TRect);
begin
  if Panel.Index = 0 then begin
    ...
  end else if Panel.Index = 1 then begin
    ...
  end else if Panel.Index = 2 then begin
    StatusBar1.Canvas.Brush.Color := clRed;
    StatusBar1.Canvas.TextOut(Rect.Left + 2, Rect.Top, Panel.Text);
  end;
end;

A cor você coloca a que for mais conveniente para seu projeto. Ou uma para chamar a atenção para alguma frase de alerta..



Um comentário:

  1. Bonito trabalho. Código limpo. ainda mais o StatusBar. eu nunca testei, mas tem uma maneira de escrever um gif animado no statusbar?

    ResponderExcluir