ListBox kolorowanie

0

Z racji, że jest to mój pierwszy post na tym forum, pragnę się z wszystkimi przywitać. I od razu przechodzę do problemu. Mam problem z kolorowaniem ListBoxa. Mam pętle w której mam 3 zmienne losowo wybrane w celu stworzenia koloru rgb rgb(r, g, b). Mam również komponent ListBox1. No i mam taki oto problem związany z nim - chciałbym aby każdy wiersz w ListBoxie miał tło zgodny z tym kolorem chwilowym rgb. Dodaje element do ListBoxa i koloruje dany wiersz na chwilowy kolor.

ListBox1.Items.Add(nr);
ListBox1.Brush.Color:=rgb(r,g,b);

ListBox1.Brush.Color lub ListBox1.Color koloruje tło całego ListBoxa a mi chodzi o kolorowanie tylko jednego, chwilowego, nowododanego wiersza. Jak najprościej coś takiego osiągnąć?

0

Było na forum. Szukaj tematów - OnDrawItem

0

Dokladnie było na forum, miałem właśnie odpisać, najprostszy przykład poniżej:

//...
procedure TForm1.FormCreate(Sender: TObject);
begin
  Randomize;
  ListBox1.Style := lbOwnerDrawFixed;
end;

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
  TListBox(Control).Canvas.FillRect(Rect);
  TListBox(Control).Brush.Color := RGB(Random(256), Random(256), Random(256));
  TListBox(Control).Canvas.TextOut(Rect.Left + 2, Rect.Top + 2, TListBox(Control).Items[Index]);
end;
0

Witam ponownie. Użyłem kod od olesia i mam kolejne pytanie. Przepisałem kod i przypisałem kolor:

TListBox(Control).Brush.Color := Tablica[1].kolor;

No i mam taki problem - po dodaniu do listboxa 1 pozycji nic sie nie zmiania, odnosnie koloru, a w kolejnych przypadkach całe tło zmienia się na to zgodne z chwilową barwą w tablicy. Jak "nauczyc" listboxa pamiętania każdego chwilowego koloru dla każdego z wiersza? Jak bym mógł takie cos wykonac posiadając tablice Tablica[] zawierająca wartosci rgb (Tablica[].kolor) oraz Tablica[].tekst tak żeby tekst w każdym wierszu i jego kolor podswietlenia był zgodny z danym elementem w tablicy?

0

Zły przykład Tobie podałem, ale mogłeś przecież zamiast czekać na odpowiedź wpisać w google: delphi listbox color items i pod
tym adresem http://delphi.about.com/cs/adptips2002/a/bltip0602_4.htm masz prawidlowy przykład. Nie musisz też używać do
przechowywania kolorów żadnej tablicy. Sam ListBox może być taką tablicą, bo może on przechowywać obiekty, tak jak i inne z
dostepnych komponentów z TStrings, w tym niewizualne TStringList. Dodajesz tylko element rzutując na TColor, bo w Objects da
się przechować różnego rodzaju typy, również własne. Jedynie dla przechowywania tekstów trzeba utworzyć własny typ TObject,
w ktorym poprzez jedno z pół typu string będziesz mógł przechowywać teksty, ale jak widać z zapisem koloru, nie ma problemu.

//...
procedure TForm1.FormCreate(Sender : TObject);
begin
  Randomize;
  ListBox1.Style := lbOwnerDrawFixed;
end;

procedure TForm1.ListBox1DrawItem(Control : TWinControl; Index : Integer;
  Rect : TRect; State : TOwnerDrawState);
var
  MyColor : TColor;
  MyBrush : TBrush;
begin
  MyBrush := TBrush.Create;
  with (Control as TListBox).Canvas do
  begin
    MyColor := TColor(TListBox(Control).Items.Objects[Index]);
    MyBrush.Style := bsSolid;
    MyBrush.Color := MyColor;
    Windows.FillRect(handle, Rect, MyBrush.Handle);
    Brush.Style := bsClear;
    TextOut(Rect.Left, Rect.Top, (Control as TListBox).Items[Index]);
    MyBrush.Free;
  end;
end;

procedure TForm1.Button1Click(Sender : TObject);
begin
  ListBox1.Items.AddObject(Edit1.Text, (TObject(TColor(RGB(Random(256), Random(256), Random(256))))));
end;
0

Powyższy przykład działa. Bardzo przydatny. Ale mam jeszcze jedno pytanie: da się jakoś zaznaczyć pojedynczy element z listy w ListBoxie i następnie usunąć go bez niszczenia kolejności kolorów (znika mi element z tekstem i podświetleniem jego)? Jakiś dodatkowy button po kliknięciu którego zaznaczony element zniknie?

0

To dziwne, usuwanie elementu z listy nie powoduje zmiany kolorów, bo te są przypizane do każdego Itema,
no ale jeżeli mimo wszystko przy usuwaniu coś się zmienia, a tego nie chcesz to polecam zrobić tak - jak to
poniżej pokazałem, czyli przed usunięciem elementu zrezygnować z procedury zdarzenia, zaś pó ją przywrócić.

  if ListBox1.ItemIndex > -1 then
  begin
    ListBox1.OnDrawItem := nil;
    ListBox1.Items.Delete(ListBox1.ItemIndex);
    ListBox1.OnDrawItem := ListBox1DrawItem;
  end;
0

Jeszcze raz bardzo dziękuję - bardzo dużo zaoszczędziło mi to czasu. Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1