![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Друзья, можете кидать в меня камнями и кричать "Баян", но поверьте, весь вечер гуглил как прокажённый, и толком не понял как реализовать выделение определённых строк в 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] |