Jak rysować po ListBoxie
Adam Boduch
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;