ListBox i kolorowe zaznaczone itemy

0

Więc tak. Uporałem się, jak zrobić listBoxa tak, żeby np. po wciśnięciu przycisku kolejny item zyskiwał czerwony kolor, a reszta, żeby była czarna. Nawet uporałem się z tym, jak zrobić, że jeżeli zaznaczony item miał wcześniej kolor czerwony to, gdy jest zaznaczony ma żółty, a gdy miał wcześniej czarny i jest zaznaczony, to ma biały.
(taki wygląd a'la playlisty)

Wszystko pięknie działa, ale tylko wtedy, gdy zaznaczony jest jeden item. Gdy zaznaczam już więcej, wtedy ciekawe rzeczy się robią. Próbowałem to zrobić tak:

zmienna globalna:

var
 cl: array of integer;

Procedura OnClick listBoxa:

procedure TForm1.ListBox1Click(Sender: TObject);
var
 i: integer;
 a: integer;
begin
 a:=0;
 setLength(cl, listBox1.SelCount);

 if listBox1.SelCount=1 then cl[0]:=listBox1.ItemIndex else
    begin
      for i:=0 to listBox1.Count-1 do
          begin
           if listBox1.Selected[i] then cl[a]:=i;
           a:=a+1;
          end; 
    end;


 if listBox1.SelCount=1 then
    ListBox1DrawItem(listBox1, cl[0], ListBox1.ItemRect(cl[0]), [])
    else
    for i:=0 to listBox1.SelCount-1 do
         ListBox1DrawItem(listBox1, cl[i], ListBox1.ItemRect(cl[i]), []);
    listBox1.Invalidate;
end;

tablica cl ma przechowywać indexy zaznaczonych itemów

teraz procedura DrawItem:

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
var
 i: integer;
begin
 listBox1.Canvas.Font.Color:=clBlack;
 if index=id then listBox1.Canvas.Font.Color:=clRed
    else listBox1.Canvas.Font.Color:=clBlack;

 if cl<>nil then
    begin
     if listBox1.SelCount=1 then
        begin
         if (index=cl[0]) and (index<>id) then listBox1.Canvas.Font.Color:=clWhite;
         if (index=cl[0]) and (index=id) then listBox1.Canvas.Font.Color:=clYellow;
        end else
        begin
         for i:=0 to listBox1.SelCount do
             begin
              if (index=cl[i]) and (index<>id) then listBox1.Canvas.Font.Color:=clWhite;
              if (index=cl[i]) and (index=id) then listBox1.Canvas.Font.Color:=clYellow;
             end;
        end;
    end;

 listBox1.Canvas.FillRect(rect);
 listBox1.Canvas.TextOut(listBox1.ItemRect(index).Left+2, listBox1.itemRect(index).Top, listBox1.Items[index]);

end;

Jeśli coś jest nieczytelne, to mówcie.
Proszę o pomoc.
Jak zrobić, żeby było dobrze przy zaznaczonym więcej niż jednym itemie?

0

Zassaj komponent Drajwera i podejrzyj jak on rozwiązał ten problem.

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