Советы по Delphi

Как сделать так, чтобы каждая строка в ListBox имела свой цвет?


У меня есть два примера процедур OnDrawItem:

    procedure TTest.ListBox1DrawItem(Control: TWinControl;
Index: Integer; Rect: TRect; State: TOwnerDrawState); begin
With
( Control As TListBox ).Canvas Do Begin Case Index Of 0:

Begin Font.Color  := clBlue; Brush.Color := clYellow; End; 1: Begin Font.Color  := clRed; Brush.Color := clLime; End; 2: Begin Font.Color  := clGreen; Brush.Color := clFuchsia; End; End; FillRect(Rect); TextOut(Rect.Left, Rect.Top, ( Control As TListBox ).Items[Index]); End; end;

Вышеприведенный код устанавливает различный цвет у фона и текста в зависимости от номера строки, но он не работает с выделенными/выбранными строками (кстати, не забудьте установить значение свойства ListBox1.Style равным lbOwnerDrawFixed.)

    procedure TListTest.ListBox1DrawItem( Control: TWinControl;
Index: Integer; Rect: TRect; State: TOwnerDrawState );
Const
HighLight = 'LINE';
Var
TempLine, TempText, TempHigh: String; TempLeft, TempTop, TempStart: Integer; OldColor: TColor;
begin
with
( Control as TListBox ).Canvas do begin FillRect( Rect ); TempLeft := Rect.Left + 3; TempTop := Rect.Top + 1; TempLine := ( Control as TListBox ).Items[ Index ];
While TempLine > '' Do Begin TempStart := Pos( HighLight, AnsiUpperCase( TempLine ) );
If TempStart > 0 Then Begin TempText := Copy( TempLine, 1, TempStart - 1 ); TempHigh := Copy( TempLine, TempStart, Length( HighLight ) ); Delete( TempLine, 1, TempStart + Length( HighLight ) - 1 ); End Else Begin TempText := TempLine; TempHigh := ''; TempLine := ''; End;
If TempText > '' Then Begin TextOut( TempLeft, TempTop, TempText ); Inc( TempLeft, TextWidth( TempText ) ); End;
If TempHigh > '' Then Begin OldColor := Font.Color; If odSelected In State Then Font.Color := clYellow Else Font.Color := clBlue; TextOut( TempLeft, TempTop, TempHigh ); Inc( TempLeft, TextWidth( TempHigh ) ); Font.Color := OldColor; End; End; end; end;

Это можно протестировать со следующими тремя строками:

'Строка номер один'
'Вторая строка'
'Это строчка номер три'

Есть несколько вещей, достойных упоминания:

Я использую параметр Control для приведения типов ( Control as TListBox ).Items[ Index ], что убедиться в том, что я использую данные ListBox, такой способ позволяет сделать общим данный обработчик события для нескольких компонентов TListBox, например, если у вас имеется пара ListBox на различных страницах TNoteBook.

OldColor и проверка параметра State позволяет быть уверенным, что выбранная строка содержит видимый цвет шрифта (множество видеодрайверов используют белый текст на синем фоне для выбранной строки).

Также я создаю небольшое свободное пространство вокруг текста - увеличиваю TListBox.ItemHeight и, соответственно, область вывода текста - TempLeft := Rect.Left + 3 и TempTop := Rect.Top + 1.

[000153]



Содержание раздела