A megvalósításhoz feltöltünk egy ListBox-ot a lehetséges értékekkel. A megjelenítést mi magunk végezzük az OnDrawItem eseménynél, így nem csak a színek nevei és RGB értékei láthatóak, hanem rögtön maga az adott szín is megjelenik egy kis téglalapban.
Ehhez a művelethez a ListBox Style property-jét lbOwnerDrawFixed értékre választjuk.
Az OnDrawItem eseménykezelőben vizsgáljuk, hogy a State paraméterként milyen értéket kaptunk. Ebből megtudhatjuk, hogy az éppen kirajzolandó elem a ListBox-ban kiválasztott-e vagy sem, és ennek megfelelően választhatjuk meg a szükséges színeket.
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
begin
with ListBox1.Canvas do begin
if odSelected in State then begin
...
end;
Ezt követően kirajzoljuk a hátteret és ráírjuk az adott elem feliratát.
Rectangle(Rect);
TextOut(Rect.Left+30, Rect.Top, ListBox1.Items[Index]);
Végül már csak az adott színű téglalap kirajzolása marad. Ehhez át kell alakítanunk az adott elem szövegében lévő RGB színt TColor típussá.
Brush.Color:=StrToInt('0x'+Reverse(ListBox1.Items.Values[ListBox1.Items.Names[Index]]));
Rectangle(Rect.Left, Rect.Top, Rect.Left+25, Rect.Bottom);
end;
end;
Ha a felhasználó kattint a ListBox-on, akkor a kiválasztott színt adjuk a Panel színének és rögtön vágólapra helyezzük a kiválasztott szín megnevezését, így az átvihető más alkalmazásba.
procedure TForm1.ListBox1Click(Sender: TObject);
begin
Panel1.Caption:=ListBox1.Items.Values[ListBox1.Items.Names[ListBox1.ItemIndex]];
Panel1.Color:=StrToInt('0x'+Reverse(Panel1.Caption));
Clipboard.AsText:=ListBox1.Items.Names[ListBox1.ItemIndex];
end;