Mudar cor de fundo da linha do ListBox

Delphi

23/06/2004

Olá!

Gostaria de saber como faz para mudar a cor de fundo de um item num ListBox.

Por exemplo: Ao inserir um item, se for a linha zero do ListBox, mantem fundo branco; Se for a linha 1, troca para vermelho a cor de fundo APENAS DESTE ITEM; Se for a linha 2, mantém a cor de fundo em branco, e assim em diante alternando as cores.

Tem com ser feito isso?

Obrigado.
wbb


Wbb

Wbb

Curtidas 0

Respostas

Minuto

Minuto

23/06/2004

Amigo que eu saiba, o listbox tem cor única para fazer isso use um grid
talvez exista algum componente evoluido do listbox que faça isso.?!?!


GOSTEI 0
Minuto

Minuto

23/06/2004

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
begin
with ListBox1, ListBox1.Canvas do
begin
if (odSelected in State) then
begin
Brush.Color:= clDkGray; //Cor quando estiver selecionado
Pen.Color:= clBlack;
DrawFocusRect(Rect);
end
else
begin
Brush.Color:= clLtGray;//Cor quando não estiver selecionado
Pen.Color:= clLtGray; //Coloque a mesma cor da linha de cima
end;
Rectangle(Rect);
TextOut(Rect.Left+1, Rect.Top+1, Items[Index]);
end;
end;


GOSTEI 0
Marcelo Saviski

Marcelo Saviski

23/06/2004

Use o o evento OnDrawItem deste componentes para conseguir o efeito desejado

[i:a12d4fc460][color=darkblue:a12d4fc460]procedure(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);[/color:a12d4fc460][/i:a12d4fc460]

faça um teste assim:

no evento OnDrawItem, adicione:

with TComboBox(Control) do
begin
  if odSelected in State then
  begin
    Canvas.Brush.Color := clHighlight;
    Canvas.Font.Color := clHighlightText;
  end  
  else if Odd(Index) then //se é um item ímpar
  begin
    Canvas.Brush.Color := clRed;
    Canvas.Font.Color := clWhite;    
  end
  else
  begin
    Canvas.Brush.Color := clWhite;
    Canvas.Font.Color := clBlack;
  end;
  Canvas.Fill(Rect);
  Canvas.Brush.Style := bsClear;
  Canvas.TextOut(Rect.Left, Text.Top, Items[Index]);
end;


com isso vc usa uma função sua para pintar os itns, da p/ fazer mais do que simplesmente deixar listrado, é só usar a criatividade

:!:


GOSTEI 0
Minuto

Minuto

23/06/2004

Desculpe postei o código errado

No evento OnDrawItem do ListBox coloque:

Código:

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
begin
ListBox1.Canvas.Brush.Color := clWhite;
ListBox1.Canvas.FillRect(Rect);
case Index of
// Aqui você escolhe a cor do texto para cada linha:
0: ListBox1.Canvas.Font.Color := clRed;
1: ListBox1.Canvas.Font.Color := clGreen;
2: ListBox1.Canvas.Font.Color := clBlue;
end;
ListBox1.Canvas.TextOut(Rect.Left, Rect.Top, ListBox1.Items[Index]);
end;



Mas antes você deve mudar a propriedade Style do ListBox para lbOwnerDrawVariable


GOSTEI 0
Wbb

Wbb

23/06/2004

Obrigado pessoal!

Resolvi da seguinte maneira:

procedure Tform1.ListBox1DrawItem(Control: TWinControl;
  Index: Integer; Rect: TRect; State: TOwnerDrawState);
begin
   with (Control as TListBox).Canvas do
   begin
      if Index mod 2 = 0 then
      begin
         Brush.Color := clBlue;
         Font.Color := clWhite;
      end;

      Brush.Style := bsSolid;
      FillRect(Rect);
      Brush.Style := bsClear;
      TextOut(Rect.Left, Rect.Top,(Control as TListBox).Items[Index]);
   end;
end;


O código acima gera itens com suas cores de fundo alternadas entre branco e azul.

[b:2f62eeab9b][color=red:2f62eeab9b]IMPORTANTE[/color:2f62eeab9b][/b:2f62eeab9b]: Para fucionar é necessário que antes seja alterada a propriedade Style do ListBox para lbOwnerDrawFixed.

Valeu.
wbb


GOSTEI 0
Marcelo Saviski

Marcelo Saviski

23/06/2004

Ótimo, para quem quiser diferenciar o Item selecionado, pode verificar se: [color=darkblue:7aff823126] odSelected in State [/color:7aff823126], e selecionar uma cor diferente, como nos códigos acima


GOSTEI 0
POSTAR