Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/170: Рейтинг темы: голосов - 170, средняя оценка - 4.71
19 / 19 / 0
Регистрация: 15.01.2010
Сообщений: 236

Как поменять цвет строки в listbox?

22.03.2010, 02:52. Показов 34008. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
подскажите как сделать что бы можно было менять цвет строки в листбоксе. сейчас добавляю так-
Delphi
1
2
3
4
5
procedure addlog(txt:string);
begin
 Form1.Listbox1.Items.Add(txt);
 Form1.ListBox1.TopIndex:=Form1.ListBox1.Items.Count-1;
end;
можно сюда дополнительный параметр например 0 - обычный цвет, 1- красный, 2- синий.

addlog(0, 'текст');

?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.03.2010, 02:52
Ответы с готовыми решениями:

Как поменять цвет ListBox?
можете изменить цвет? как изменить цвет? пожалуйста помоги) жду вами ответ:friends:

Можно ли поменять цвет активного элемента ListBox
Здравствуйте, можно ли поменять цвет активного элемента ListBox (синяя полоса) заранее благодарен.

Поменять цвет шрифта у конкретного элемента listbox
Делаю в WPF. Необходимо поменять цвет шрифта у конкретного элемента listbox. пишу так: listbox.items.Foreground=Brushes.Green; ...

17
 Аватар для Mawrat
13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
22.03.2010, 10:23
Надо установить свойство (в инспекторе объектов или программно):
ListBox1.Style = lbOwnerDrawFixed;
Затем, написать обработчик для события OnDrawItem:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
  with ListBox1.Canvas do begin
    if (Index + 1) mod 2 = 0 then begin
      //Если прорисовываемая строка чётная.
      Brush.Color := RGB(100, 150, 150);
      FillRect(Rect);
      Font.Color := RGB(255, 255, 255);
      TextOut(Rect.Left, Rect.Top, ListBox1.Items[Index]);
    end else begin
      //Если прорисовываемая строка нечётная.
      Brush.Color := RGB(150, 150, 100);
      FillRect(Rect);
      Font.Color := RGB(255, 255, 255);
      TextOut(Rect.Left, Rect.Top, ListBox1.Items[Index]);
    end;
  end;
end;
3
19 / 19 / 0
Регистрация: 15.01.2010
Сообщений: 236
22.03.2010, 13:13  [ТС]
непонимаю как это использовать
0
 Аватар для Mawrat
13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
22.03.2010, 18:43
Можно действовать так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
procedure TForm1.AddLog(const aStr: String; const aColor: TColor);
begin
  //Добавляем в качестве очередного элемента пару: строка + объект.
  //Но в качестве объекта передаём на самом деле сведения о цвете.
  //Т. е. таким образом мы добавляем информацию - строку и цвет фона,
  //который будет прорисован для этой строки.
  ListBox1.Items.AddObject(aStr, TObject(aColor));
end;
 
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
  with ListBox1.Canvas do begin
    //Извлекаем сведения о цвете фона и задаём для кисти этот цвет.
    Brush.Color := TColor( ListBox1.Items.Objects[Index] );
    //Закрашиваем прямоугольник, в который потом будет выведена строка.
    FillRect(Rect);
    //Выводим текст строки.
    TextOut(Rect.Left, Rect.Top, ListBox1.Items[Index]);
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  Randomize;
  AddLog(
    'Строка №' + IntToStr(ListBox1.Items.Count),
    RGB(50 + Random(11) * 20 , 150, 150)
  );
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  ListBox1.Clear;
end;
4
19 / 19 / 0
Регистрация: 15.01.2010
Сообщений: 236
31.03.2010, 17:12  [ТС]
блин. мне надо только цвет шрифта менять а не всей строки. ошибся. как только цвет шрифта менять?
0
 Аватар для Mawrat
13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
31.03.2010, 19:55
Прорисовка разными цветами самого текста в строках:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    ListBox1: TListBox;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure ListBox1DrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure AddLog(const aStr : String; const aColor : TColor);
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.AddLog(const aStr: String; const aColor: TColor);
begin
  //Добавляем в качестве очередного элемента пару: строка + объект.
  //Но в качестве объекта передаём на самом деле сведения о цвете.
  //Т. е. таким образом мы добавляем информацию - строку и цвет шрифта,
  //которым будет прорисован текст этой строки.
  ListBox1.Items.AddObject(aStr, TObject(aColor));
end;
 
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
var
  OldColor : TColor;
begin
  with ListBox1.Canvas do begin
    //Запоминаем действующий цвет шрифта.
    OldColor := Font.Color;
    //Извлекаем сведения о цвете шрифта и задаём для шрифта канвы этот цвет.
    Font.Color := TColor( ListBox1.Items.Objects[Index] );
    //Выводим текст строки.
    TextOut(Rect.Left, Rect.Top, ListBox1.Items[Index]);
    //Восстанавливаем прежний цвет шрифта.
    Font.Color := OldColor;
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  Randomize;
  AddLog(
    'Строка №' + IntToStr(ListBox1.Items.Count),
    RGB(Random(11) * 20 , Random(11) * 20, Random(11) * 20)
  );
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  ListBox1.Clear;
end;
 
end.
2
 Аватар для Milord
4 / 4 / 0
Регистрация: 03.11.2009
Сообщений: 91
16.12.2010, 11:06
Господа! А как можно сделать раскраску строк в режиме runtime? поясняю я не знаю когда и какая строка должна быть подкрашена. Цикл заполняет ListBox из БД по требованию юзера и в зависимости от значения в одном столбце подкрашивать строку в Listbox (выводит же данные из другого столбца).
Подкрасить возможно потребуется одну строку а может и все...
Все примеры что я находил при перерисовке стирают предшествующие подкрашенные строки...
как быть?
0
 Аватар для Mawrat
13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
16.12.2010, 11:20
Цитата Сообщение от Milord Посмотреть сообщение
Цикл заполняет ListBox из БД по требованию юзера и в зависимости от значения в одном столбце подкрашивать строку в Listbox (выводит же данные из другого столбца).
Для этой задачи подойдёт код представленный несколькими постами выше. Там механизм построен на том, что мы в качестве элементов в лист бокс записываем не только строковые данные, но и сведения о раскраске данной строки. Элементы лист бокса - это пары: строка - объект. Вот в качестве объекта и цепляются сведения о раскраске. Это выполняется в этом методе:
Delphi
1
2
3
4
5
6
7
8
procedure TForm1.AddLog(const aStr: String; const aColor: TColor);
begin
  //Добавляем в качестве очередного элемента пару: строка + объект.
  //Но в качестве объекта передаём на самом деле сведения о цвете.
  //Т. е. таким образом мы добавляем информацию - строку и цвет фона,
  //который будет прорисован для этой строки.
  ListBox1.Items.AddObject(aStr, TObject(aColor));
end;
Т. е. здесь мы добавляем в лист бокс строку aStr и вместе с ней добавляем сведения о том, каким цветом должна быть раскрашена эта строка: aColor.
4
0 / 0 / 0
Регистрация: 24.07.2015
Сообщений: 20
18.04.2017, 16:02
Добрый день!
Подскажите пожалуйста как вернуть стандартное выделение текущей строки при использовании стиля lbOwnerDrawFixed.

Я использую Checklistbox. Если пользователь ставит галочку на какой либо строке, то эта строка окрашивается цветом по определенному алгоритму.
Но если допустим выбрать какую либо окрашенную строку, то на ней появляется мелкая штриховая окантовка, при этом цвет самой строки не меняется. В результате визуально тяжело определить какая строка сейчас выделена.

Спасибо!
Изображения
 
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,653
Записей в блоге: 21
18.04.2017, 16:34
анализируйте параметр State: TOwnerDrawState
и если там odSelected in State
раскрашивайте другими цветами
0
0 / 0 / 0
Регистрация: 24.07.2015
Сообщений: 20
18.04.2017, 22:05
Цитата Сообщение от krapotkin Посмотреть сообщение
анализируйте параметр State: TOwnerDrawState
и если там odSelected in State
раскрашивайте другими цветами
Не совсем подходит, либо я не понимаю как правильно это применить. Объясню.
Событие DrawItem возникает при любом действии со списком ListBox. Если событие вызвано глобальным изменением ListBox, то есть перерисовываются все элементы, то ваше предложение работает, так как обрабатывается каждая строка.
Но если пользователь щелкает по одной строке то DrawItem срабатывает только один раз и только для данной строки. Соответственно при выделении следующей строки изменяется только она, а предыдущая строка не перерисовывается. В результате получается куча выделенных строк, пока допустим не начнешь скролить.

Придумал как решить данный вопрос. Все получилось. Нужно было всего лишь запомнить данные текущей строки и при следующем срабатывании события перерисовывать текущую и предыдущую строки. Всем спасибо!
Если есть более элегантное решение, то буду только рад применить его.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
procedure TForm2.CheckListBox1Click(Sender: TObject);
var i:Integer;
 begin
   FirstFlag:=True; //Пользователь начал работать со списком. Разрешаем изменять предыдущую строку
 end;
 
//Присваиваем строкам цвета в зависимости от чекбокса. Если выбрано больше 9 строк, то
//запрещаем дальше выставлять галочки.
procedure TForm2.CheckListBox1ClickCheck(Sender: TObject);
var i,d:Integer;
 begin
   d:=0;
   for I :=1 to CheckListBox1.Items.Count do
    if CheckListBox1.Checked[i-1]=True then
      begin
        d:=d+1;
        if (d<10) then
          begin
            CheckListBox1.Items.Objects[I-1]:=TObject(AColors[d+1]);
            CheckListBox1.Checked[i-1]:=False; //Это нужно чтобы перерисовать цвета выбранных строк
            CheckListBox1.Checked[i-1]:=True;  // активируя событие drawitem для данной строки
            CheckListBox1.ShowHint:=False; //отключаем подсказку
          end
         else
          begin
            CheckListBox1.Items.Objects[I-1]:=TObject(clWhite); //возвращаем цвет по умолчанию
            CheckListBox1.Checked[i-1]:=False; //снимаем галочку так как превышен лимит выбора
            CheckListBox1.ShowHint:=True; //включаем подсказку что более 9 строк выбирать нельзя
          end;
      end
     else CheckListBox1.Items.Objects[I-1]:=TObject(clWhite); //возвращаем цвет по умолчанию для всех невыбранных строк
 end;
 
//Присваиваем цвета выделенным строкам в списке
procedure TForm2.CheckListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
 begin
   // Прорисовка строки при глобальном обновлении
   with CheckListBox1.Canvas do
     begin
         Brush.Color := TColor(CheckListBox1.Items.Objects[Index]);
         FillRect(Rect);
         Font.Color :=clBlack;
         TextOut(Rect.Left, Rect.Top, CheckListBox1.Items[Index]);
      end;
   //Снимаем выделение с предыдущей выделенной строки
   if FirstFlag=True then
     with CheckListBox1.Canvas do
       begin
           Brush.Color := TColor(CheckListBox1.Items.Objects[LastIndex]);
           FillRect(LastRect);
           Font.Color :=clBlack;
           TextOut(LastRect.Left, LastRect.Top, CheckListBox1.Items[LastIndex]);
        end;
//Выделяем текущую строку
   if CheckListBox1.ItemIndex=Index then
     with CheckListBox1.Canvas do
      begin
         Brush.Color := clBlack;
         FillRect(Rect);
         Font.Color :=clWhite;
         TextOut(Rect.Left, Rect.Top, CheckListBox1.Items[Index]);
      end;
//Запоминаем данные текущей строки для обработки при следующем срабатывании события
 LastIndex:=Index;
 LastRect:=Rect;
 end;
Миниатюры
Как поменять цвет строки в listbox?  
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,653
Записей в блоге: 21
18.04.2017, 22:24
чисто теоретически что-то я не очень верю
должны бы перерисовываться обе строки автоматически и старая и новая

Добавлено через 7 минут
ну, и как всегда, правильно не верил
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
procedure TForm1.CheckListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
  if odselected in State then
  begin
    CheckListBox1.Canvas.Brush.Color := clBlue;
  end
  else
  if odd(index) then
  begin
    CheckListBox1.Canvas.Brush.Color := clRed;
  end
  else
  begin
    CheckListBox1.Canvas.Brush.Color := clWhite;
  end;
  CheckListBox1.Canvas.FillRect(rect);
  CheckListBox1.Canvas.TextOut(rect.Left+2,rect.Top+2,CheckListBox1.Items[index]);
end;
все корректно. перерисовывается самостоятельно и верно
1
0 / 0 / 0
Регистрация: 24.07.2015
Сообщений: 20
18.04.2017, 23:02
krapotkin, ну как бы вот так. Я пробовал разные варианты пока не пришел к такому выводу. Сначала вообще не понимал как возникает это событие. Но танцы с бубном привели к выше написанному выводу.
Ну и как бы объявление процедуры, а вернее переменная Index наталкивает на мысль что она была бы тут бесполезной, если бы событие затрагивало все строки.
procedure TForm2.CheckListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);

Добавлено через 5 минут
krapotkin, да работает. Но пока не понимаю как)))

Добавлено через 30 минут
Видимо я что то не так делал с этим состоянием, раз у меня не получилось. Не соображу пока.
Но тем не менее мне не понятен механизм работы события.
Вот сейчас проверил два варианта. Один работает, второй нет. Отличие только в первой строке. В чем принципиальное различие не понимаю. Объясните пожалуйста.

Вариант 1. Тут все верно, выделение снимается с предыдущей строки
Delphi
1
2
3
4
5
6
7
 if odselected in State then
    CheckListBox1.Canvas.Brush.Color := clBlue
  else
   CheckListBox1.Canvas.Brush.Color := clRed;
 
  CheckListBox1.Canvas.FillRect(rect);
  CheckListBox1.Canvas.TextOut(rect.Left,rect.Top,CheckListBox1.Items[index]);
Вариант 2. Тут выделение остается на предыдущей строке
Delphi
1
2
3
4
5
6
7
 if CheckListBox1.ItemIndex=Index then
    CheckListBox1.Canvas.Brush.Color := clBlue
  else
   CheckListBox1.Canvas.Brush.Color := clRed;
 
  CheckListBox1.Canvas.FillRect(rect);
  CheckListBox1.Canvas.TextOut(rect.Left,rect.Top,CheckListBox1.Items[index]);
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,653
Записей в блоге: 21
19.04.2017, 08:35
система вызывает вместо своей (точнее - после своей) функции - вашу для перерисовки итема
тогда когда ЕЙ надо. соответственно после изменения itemIndex будут перерисованы как минимум ДВА item
при этом в разных параметрах она сообщает вам, в каком состоянии находится item
State - это набор (set) таких состояний. если в State указано, что item выделен, то я должен покрасить его выделенным
по-хорошему, если там содержится Focused, я еще и пунктирную рамку должен сам оформить
если не указано, раскрашиваем как нам надо для всех невыделенных item
1
0 / 0 / 1
Регистрация: 05.06.2014
Сообщений: 175
16.12.2019, 15:00
покажите пожалуйста на примере как присвоить цвет сроке которая уже существует

Delphi
1
Form2.lst1.Items[nlst]:= 'Авторизуемся в: '+akk;
как придать этой строке цвета разные по необходимости, или фону или тексту.
работа с одинаковыми строками но менять цвет надо при условиях и замене статуса
0
 Аватар для Мудрый Ижик
32 / 26 / 7
Регистрация: 18.10.2019
Сообщений: 187
16.12.2019, 15:12
lotes читайте тему с начала, а не с конца - обнаружите массу интересной информации по вашему вопросу.
0
0 / 0 / 1
Регистрация: 05.06.2014
Сообщений: 175
16.12.2019, 15:56
я могу сделать цвет добавляемой строке но не могу понять как поменять цвет в существующей по номеру строки, саму логику не понял из текста выше.

Delphi
1
Form2.lst1.Items[nlst]:= 'Авторизуемся в: '+akk;
как в строке номер 3 поменять цвет и текст с учетом что есть:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
procedure TForm2.lst1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect;
  State: TOwnerDrawState);
var
  OldColor : TColor;
begin
  with Lst1.Canvas do begin
    //Запоминаем действующий цвет шрифта.
    OldColor := Font.Color;
    //Извлекаем сведения о цвете шрифта и задаём для шрифта канвы этот цвет.
    Font.Color := clRed;
    //Выводим текст строки.
    TextOut(Rect.Left, Rect.Top, Lst1.Items[Index]);
    //Восстанавливаем прежний цвет шрифта.
    Font.Color := OldColor;
  end;
end;
0
Модератор
4114 / 2346 / 807
Регистрация: 15.11.2015
Сообщений: 9,326
16.12.2019, 16:24
lotes, это процедура отрисовки. У вас известен номер строки, которую нужно выделить другим цветом. Тогда, в процедуре сверяете Index с этим номером и если совпадает, то присваиваете другой цвет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.12.2019, 16:24
Помогаю со студенческими работами здесь

WPF Listbox Items поменять цвет текста у добавляемого элемента
Подскажите, в Listbox по определенным событиям добавляются строки по команде: ListBox.Items.Add(&quot;&quot;); Как поменять цвет текста...

Datagrid как поменять цвет фона строки при выполнении условия
Здравствуйте! Мне нужно в таблице поменять цвет строки/ячейки (не особо важно). Если ячейка типа bool true, то выделить, если false то...

как для одной строки поменять цвет маркера тега <mark>
для тега &lt;mark&gt; по умолчанию стоит жёлтый. как сделать его другим цветом при условии чтобы поменялся только в одной строке цвет так как на...

Listbox цвет фона строки
Привет, кто знает как можно изменить цвет фона строки в listbox, а также цвет фона строки когда она выделена?

Изменить цвет строки listbox по индексу
Здравствуйте подскажите пожалуйста как изменить цвет строки listbox по индексу?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru