Советы по Delphi

       

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


У меня есть два примера процедур OnDrawItem:
procedure TTest.ListBox1DrawItem(Control: TWinControl;
Index: Integer; Rect: TRect; State: TOwnerDrawState);begin
With
( Control As TListBox ).Canvas DoBeginCase Index Of0:BeginFont.Color := clBlue;Brush.Color := clYellow;End;1:BeginFont.Color := clRed;Brush.Color := clLime;End;2:BeginFont.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 dobeginFillRect( Rect );TempLeft := Rect.Left + 3;TempTop := Rect.Top + 1;TempLine := ( Control as TListBox ).Items[ Index ];
While TempLine > '' DoBeginTempStart := Pos( HighLight, AnsiUpperCase( TempLine ) );
If TempStart > 0 ThenBeginTempText := Copy( TempLine, 1, TempStart - 1 );TempHigh := Copy( TempLine, TempStart, Length( HighLight ) );Delete( TempLine, 1, TempStart + Length( HighLight ) - 1 );EndElseBeginTempText := TempLine;TempHigh := '';TempLine := '';End;
If TempText > '' ThenBeginTextOut( TempLeft, TempTop, TempText );Inc( TempLeft, TextWidth( TempText ) );End;
If TempHigh > '' ThenBeginOldColor := Font.Color;If odSelected In State ThenFont.Color := clYellowElseFont.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]



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