Произвольные цвета в ListBox + выделение жирным

Стандартный компонент ListBox очень удобен для вывода различной информации. Но его базовые возможности по оформлению этой самой информации, увы, оставляют желать лучшего. Есть, однако, простой способ украсить ListBox, сделав строки в нём разного цвета, а часть из них — выделить, например, жирным или курсивом.
Для начала нам нужно включить ручную отрисовку пунктов в ListBox, установки его свойство Style=lbOwnerDrawVariable. Затем необходимо написать собственный обработчик события OnDrawItem. Например такой:

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; ARect: TRect; State: TOwnerDrawState);
var
 txt: string;
begin
 with ListBox1 do
  begin
   // "Забираем" текст текущего пункта в переменную
   // (это даёт возможность его изменения)
   txt:=Items[Index];

   // Присваиваем нужный цвет фона чётным/нечётным строкам
   if (Index mod 2)=0
    then Canvas.Brush.Color:=clWindow
    else Canvas.Brush.Color:=clGray;

   // Выделенная строка
   if (odSelected in State) then
    begin
     Canvas.Brush.Color:=clGreen;
     Canvas.Font.Color:=clWhite;
    end;

   // Выделение пунктов, начинающихся с заданного символа
   if txt[1]='!' then
    begin
     Canvas.Font.Style:=Canvas.Font.Style+[fsBold];
     // "отрезаем" символ-флаг
     txt:=Copy(txt, 2, Length(txt));
    end
    else Canvas.Font.Style:=Canvas.Font.Style-[fsBold];

   // Готовим канву к отрисовке
   Canvas.FillRect(ARect);
   // Отрисовываем текст с заданными параметрами
   Canvas.TextOut(ARect.Left, ARect.Top, txt)

  end;
end;

Приведённый код раскрашивает чётные строки серым цветом, выделенную строку делает зелёной (попутно меняя цвет текста), а любые строки, начинающиеся с символа «!», выделяет жирным. Используя данный код в качестве примера, вы легко улучшите внешний вид своего ListBox. Обратите внимание, что условие проверка условия odSelected in State будет работать только если к вашему проекту подключен модуль LCLType.
Как всегда вы можете скачать пример, приведённый выше, целиком.

2 комментария

  1. Ответить

    • От Lazarus.Su

      Ответить

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *