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..
Exemplo: Download do exemplo
Bonito trabalho. Código limpo. ainda mais o StatusBar. eu nunca testei, mas tem uma maneira de escrever um gif animado no statusbar?
ResponderExcluir