Programowanie w języku Delphi » FAQ

Jak rysować po ListBoxie

Ten sposób działa w przypadku ListBox'a jak i ComboBox'a. W moim przykładzie posłużę się komponentem ComboBox, w którym tak jak jest to w przypadku większości przypadków programów biurowych zastosuje listę rozwijalną dla czcionek.  Każda czcionka będzie posiadała kwadracik symbolizujący kolor oraz nazwa koloru. Na pewno wiesz o co chodzi - jeżeli nie wiesz to zobacz :)
Pierwsze co musisz zrobić to zmienić właściwość Style komponentu TComboBox na csOwnerDrawFixed. Teraz wygeneruj procedurę OnDrawItem komponentu. Wpisz taki kod:

type
{ Rekord zawiera pozycje kolru i nazwy tego koloru }
  TColorRec = packed record
    Color : TColor;
    Des : String[15];
  end;
 
  { Tablica kolorow }
const ColorTab : array[0..6] of TColorRec =
  (
  (Color: clBlack; Des: 'Czarny'),
  (Color: clBlue; Des: 'Niebieski'),
  (Color: clGreen; Des: 'Zielony'),
  (Color: clRed; Des: 'Czerwony'),
  (Color: clYellow; Des: 'Źółty'),
  (Color: clGray; Des: 'Szary'),
  (Color: clWhite; Des: 'Biały')
  );
 
procedure TForm1.cmbFontDrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
  with cmbFont.Canvas do
  begin
    FillRect(Rect);
    Brush.Style := bsSolid; // styl - jednolity
    Brush.Color := ColorTab[Index].Color; // kolor z tablicy
    Rectangle(Rect.Left + 2, Rect.Top + 2, Rect.Left + 32, Rect.Bottom - 2);
    Brush.Style := bsClear; // tło na przezroczyste
    TextOut(Rect.Left + 40, Rect.Top + 2, ColorTab[Index].Des); // pisz tekst
  end;
end;
Teraz generuj procedurę OnCreate: 
 
procedure TForm1.FormCreate(Sender: TObject);
var
  I : Integer;
begin
 { wypelnij pola danymi }
  for I := Low(ColorTab) to High(ColorTab) do
    cmbFont.Items.Add(ColorTab[i].Des);
end;