Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.10.2008, 01:26
w1zard w1zard вне форума
Прохожий
 
Регистрация: 04.07.2008
Сообщения: 26
Репутация: 10
По умолчанию Цветные строки в ListBox'e

Друзья, можете кидать в меня камнями и кричать "Баян", но поверьте, весь вечер гуглил как прокажённый, и толком не понял как реализовать выделение определённых строк в ListBox'e в зависимости от условий.
Подскажите пожалуйста, каким образом можно сделать следующую конструкцию:
Если <условие1> тогда сделать айтем с индексом (например "2") синим цветом;
Если <условие2> тогда сделать айтем с индексом "15" красным цветом.
Заранее спасибо.
P.S. толи уж руки у меня кривые, толи башка к вечеру уже не варит совсем, но не могу въехать, как мне по щелчку той же Button1 раскрашивать заданным макаром строки. В том плане, не доходит какую процедуру вызвать? Помогите пожалуйста, одна надежда на вас...
Ответить с цитированием
  #2  
Старый 17.10.2008, 09:26
san-46 san-46 вне форума
Активный
 
Регистрация: 25.04.2008
Сообщения: 383
Репутация: 33
По умолчанию

Код:
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;
Создается процедура на свойство OnDrawItem. В ней выводится текст и, в которой применяется расцветка по условиям. В этом примере нечетные строки в ListBox'е подсвечиваются светлосиним цветом.
Предварительно свойство ListBox'а Style устанавливается в значение lbOwnerDrawFixed.

И чего "гуглить как прокаженному", если в справке Delphi есть примеры именно по этому вопросу.
__________________
Не забывайте делать резервные копии
Ответить с цитированием
  #3  
Старый 17.10.2008, 12:01
w1zard w1zard вне форума
Прохожий
 
Регистрация: 04.07.2008
Сообщения: 26
Репутация: 10
По умолчанию

Не-не-не, ребят, неправильно я наверное вопрос сформулировал.
Скорее всего правильнее будет так: как выделить цветом Items с порядковыми номерами (Index) равными к примеру: 3,4,5 при каком-то событии, пусть будет при нажатии на кнопку. Вот что именно в обработчике Button1.Click писать, как дать указание листбоксу поменять цвет этих айтемов?
Ответить с цитированием
  #4  
Старый 17.10.2008, 12:20
san-46 san-46 вне форума
Активный
 
Регистрация: 25.04.2008
Сообщения: 383
Репутация: 33
По умолчанию

Код:
  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;
А без ListBox1DrawItem все равно не обойтись.
__________________
Не забывайте делать резервные копии
Ответить с цитированием
  #5  
Старый 17.10.2008, 16:02
w1zard w1zard вне форума
Прохожий
 
Регистрация: 04.07.2008
Сообщения: 26
Репутация: 10
По умолчанию

Огромное спасибо, выручил.
Ответить с цитированием
  #6  
Старый 18.10.2008, 22:03
Slayer005 Slayer005 вне форума
Прохожий
 
Регистрация: 18.10.2008
Сообщения: 3
Репутация: 10
По умолчанию

Ну и изврат, просто господи А зачем такое, если не секрет?
Кстати, схожий вопрос попутно - как выделять цветом текст (отдельные слова) в Мемо, когда его туда запускаешь из буфера?
Ответить с цитированием
  #7  
Старый 19.10.2008, 19:14
w1zard w1zard вне форума
Прохожий
 
Регистрация: 04.07.2008
Сообщения: 26
Репутация: 10
По умолчанию

Немного модифицировал код, который написал 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;
Всё хорошо, только у меня несколько прогонов подобных. И нужно пораскрашивать несколько айтемов разными цветами, в зависимости от условий. При вызове ListBox1.Invalidate окрашивается только одна строка. При повторном вызове Invalidate, эта строка приходит в первоначальный вид, а следующая окрашивается. Как сделать так, чтобы у строк цвет оставался?

Последний раз редактировалось w1zard, 19.10.2008 в 19:19.
Ответить с цитированием
  #8  
Старый 20.10.2008, 01:21
w1zard w1zard вне форума
Прохожий
 
Регистрация: 04.07.2008
Сообщения: 26
Репутация: 10
По умолчанию

Всё, уже сам разобрался) Ларчик просто открывался: Нужно было все условия позасовывать в обработчик ListBox1DrawItem, а по событию нужному просто вызывать ListBox1.Invalidate;
Ответить с цитированием
  #9  
Старый 29.10.2008, 17:26
Аватар для mak-karpov
mak-karpov mak-karpov вне форума
Активный
 
Регистрация: 18.09.2008
Сообщения: 235
Версия Delphi: 2010 и 7
Репутация: 1242
По умолчанию

ну запиши цвета в массив.

Colors[Index]
__________________
Кнопка "+" - весы в правом верхнем углу сообщения...
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 21:04.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter