Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.26;
Скачать: CL | DM;

Вниз

Раскраска строк в listview   Найти похожие ветки 

 
denis24   (2004-09-09 10:09) [0]

Как сделать правильно сабж?Стиль Report.

ondrawitem......
if TListView(sender).Column[3].Caption ="" then
Font.Color := clred;
FillRect(Rect);
TextOut(Rect.Left, Rect.Top,TListView(sender)........... );


 
Black ©   (2004-09-09 11:33) [1]

Это взято из FAQ"a Kuliba
Если разберёшся то поможет

У меня есть два примера процедур 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.


 
denis24   (2004-09-09 12:17) [2]

Это все хорошо.Но у меня listview в котором несколько колонок.
Я запутался с прорисовкой этих колонок.
Хочу так ,если в первой и во второй колонке значения совпадают то вся строка рисуется отдельным цветом..
Если делать так :

Sender.Canvas.TextOut(Rect.Left+23,Rect.Top+1,Item.Caption);
то рисуется только первая колонка


 
AlexSV   (2004-09-09 13:41) [3]

> denis24

вместо OnDrawItem используй

OnCustomDrawItem ...
OnCustomDrawSubItem ...



Страницы: 1 вся ветка

Текущий архив: 2004.09.26;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.053 c
9-1085947496
Vin_Ghost
2004-05-31 00:04
2004.09.26
как организовать скриптовый движек


14-1094283240
Stany
2004-09-04 11:34
2004.09.26
биллингова система


1-1094628544
TUser
2004-09-08 11:29
2004.09.26
После конструктора


4-1092660212
Manfred
2004-08-16 16:43
2004.09.26
Какое сообщение генерится при нажатии CTRL+ALT+DEL?


3-1093863655
Russko
2004-08-30 15:00
2004.09.26
Проблема с точкой и запятой.