Произвольные цвета в 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.
Как всегда вы можете скачать пример, приведённый выше, целиком.
Круто, спасибо, давно думал над реализацией — и вот наткнулся соврешенно случайно! Интересно, подойдет ли для Delphi =)