|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Цветные строки в ListBox'e
Друзья, можете кидать в меня камнями и кричать "Баян", но поверьте, весь вечер гуглил как прокажённый, и толком не понял как реализовать выделение определённых строк в ListBox'e в зависимости от условий.
Подскажите пожалуйста, каким образом можно сделать следующую конструкцию: Если <условие1> тогда сделать айтем с индексом (например "2") синим цветом; Если <условие2> тогда сделать айтем с индексом "15" красным цветом. Заранее спасибо. P.S. толи уж руки у меня кривые, толи башка к вечеру уже не варит совсем, но не могу въехать, как мне по щелчку той же Button1 раскрашивать заданным макаром строки. В том плане, не доходит какую процедуру вызвать? Помогите пожалуйста, одна надежда на вас... |
#2
|
|||
|
|||
Код:
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); begin with (Control as TListBox).Canvas do begin if Index mod 2 = 0 then Brush.Color := clSkyBlue else Brush.Color := clWhite; FillRect(Rect); TextOut(Rect.Left + 2, Rect.Top, (Control as TListBox).Items[Index]) end; end; Предварительно свойство ListBox'а Style устанавливается в значение lbOwnerDrawFixed. И чего "гуглить как прокаженному", если в справке Delphi есть примеры именно по этому вопросу. Не забывайте делать резервные копии |
#3
|
|||
|
|||
Не-не-не, ребят, неправильно я наверное вопрос сформулировал.
Скорее всего правильнее будет так: как выделить цветом Items с порядковыми номерами (Index) равными к примеру: 3,4,5 при каком-то событии, пусть будет при нажатии на кнопку. Вот что именно в обработчике Button1.Click писать, как дать указание листбоксу поменять цвет этих айтемов? |
#4
|
|||
|
|||
Код:
TForm1 = class(TForm) private ChangeColor : Boolean; public end; .... procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); begin with (Control as TListBox).Canvas do begin if not (odSelected in State) then if ChangeColor and (Index in [3..5]) then Brush.Color := clSkyBlue else Brush.Color := clWhite; FillRect(Rect); TextOut(Rect.Left + 2, Rect.Top, (Control as TListBox).Items[Index]) end; end; procedure TForm1.Button1Click(Sender: TObject); begin ChangeColor := not ChangeColor; //каждое нажатие на кнопку включае/выключает подсветку ListBox1.Invalidate; end; Не забывайте делать резервные копии |
#5
|
|||
|
|||
Огромное спасибо, выручил.
|
#6
|
|||
|
|||
Ну и изврат, просто господи А зачем такое, если не секрет?
Кстати, схожий вопрос попутно - как выделять цветом текст (отдельные слова) в Мемо, когда его туда запускаешь из буфера? |
#7
|
|||
|
|||
Немного модифицировал код, который написал san-46, вот он, ниже:
Переменная N задаёт индекс, который нужно покрасить. Переменная COLORE содержит цвет, в который нужно красить айтем. Код:
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); begin with (Control as TListBox).Canvas do begin if Index=N then Brush.Color := COLORE; FillRect(Rect); TextOut(Rect.Left + 2, Rect.Top, (Control as TListBox).Items[Index]) end; end; Последний раз редактировалось w1zard, 19.10.2008 в 19:19. |
#8
|
|||
|
|||
Всё, уже сам разобрался) Ларчик просто открывался: Нужно было все условия позасовывать в обработчик ListBox1DrawItem, а по событию нужному просто вызывать ListBox1.Invalidate;
|
#9
|
||||
|
||||
ну запиши цвета в массив.
Colors[Index] Кнопка "+" - весы в правом верхнем углу сообщения... |