Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.03.2017, 20:39   #1
nibufep
Форумчанин
 
Регистрация: 02.08.2014
Сообщений: 476
По умолчанию Подсветка ячеек listview

Доброго дня!
Как можно изменить цвет определенных ячеек?
Вот что нужно:
nibufep вне форума Ответить с цитированием
Старый 06.03.2017, 14:09   #2
Filka
Форумчанин
 
Регистрация: 29.10.2015
Сообщений: 273
По умолчанию

http://delphidabbler.com/articles?article=16
Filka вне форума Ответить с цитированием
Старый 07.03.2017, 00:37   #3
nibufep
Форумчанин
 
Регистрация: 02.08.2014
Сообщений: 476
По умолчанию

Там нет примера того что нужно мне. Там есть пример как изменить цвет всего столбца, а мне нужно именно менять цвет каждой ячейки.
nibufep вне форума Ответить с цитированием
Старый 07.03.2017, 13:42   #4
Replicant
Форумчанин
 
Аватар для Replicant
 
Регистрация: 17.08.2009
Сообщений: 139
По умолчанию

Код:
procedure TForm2.ListView1CustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: Integer; State: TCustomDrawState;
  var DefaultDraw: Boolean);
begin
  ListView1.Canvas.Brush.Color := clWhite;
  if (Item.Index = 1) and (SubItem = 3) then
  begin
    ListView1.Canvas.Brush.Color := clBlue;
  end;
    if (Item.Index = 1) and (SubItem = 1) then
  begin
    ListView1.Canvas.Brush.Color := clGreen;
  end;
    if (Item.Index = 0) and (SubItem = 2) then
  begin
    ListView1.Canvas.Brush.Color := clRed;
  end;
end;
Можно на выпадающее меню добавить возможность заливки нужным цветом, после чего создавать массив карту в который заносить координаты и цвет ячеек, а в ListView1CustomDrawSubItem и ListView1CustomDrawItem обрабатывать данную карту.
Изображения
Тип файла: jpg Снимок.JPG (10.9 Кб, 59 просмотров)

Последний раз редактировалось Replicant; 07.03.2017 в 13:48.
Replicant вне форума Ответить с цитированием
Старый 07.03.2017, 16:46   #5
nibufep
Форумчанин
 
Регистрация: 02.08.2014
Сообщений: 476
По умолчанию

Цитата:
Сообщение от Replicant Посмотреть сообщение
Код:
procedure TForm2.ListView1CustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: Integer; State: TCustomDrawState;
  var DefaultDraw: Boolean);
begin
  ListView1.Canvas.Brush.Color := clWhite;
  if (Item.Index = 1) and (SubItem = 3) then
  begin
    ListView1.Canvas.Brush.Color := clBlue;
  end;
    if (Item.Index = 1) and (SubItem = 1) then
  begin
    ListView1.Canvas.Brush.Color := clGreen;
  end;
    if (Item.Index = 0) and (SubItem = 2) then
  begin
    ListView1.Canvas.Brush.Color := clRed;
  end;
end;
Можно на выпадающее меню добавить возможность заливки нужным цветом, после чего создавать массив карту в который заносить координаты и цвет ячеек, а в ListView1CustomDrawSubItem и ListView1CustomDrawItem обрабатывать данную карту.
Так я пробовал, ну мне нужно не много не то. Мне нужно проверить в каком столбце число больше.

первый > второй = первый столбик зеленым, второй красным
первый < второй = первый красный, второй зеленый
первый = второй = оба красные

проблема в том что заполняется первый и второй столбик не одновременно, нужно с начало проверить заполнены ли оба столбца, а потом проверять и менять цвет.
nibufep вне форума Ответить с цитированием
Старый 08.03.2017, 01:13   #6
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Держи многострадальный
Код:
procedure TForm22.ListView1CustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
  TListView(Sender).Canvas.Brush.Color := clWhite;
  if (Item.Caption <> '') and (Item.SubItems[0] <> '') then begin
    If StrToInt(Item.Caption) <= StrToInt(Item.SubItems[0]) then
      TListView(Sender).Canvas.Brush.Color := clRed
    else TListView(Sender).Canvas.Brush.Color := clGreen;
  end;
end;

procedure TForm22.ListView1CustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: Integer; State: TCustomDrawState;
  var DefaultDraw: Boolean);
begin
  TListView(Sender).Canvas.Brush.Color := clWhite;
  if SubItem = 1 then begin
    if (Item.Caption <> '') and (Item.SubItems[0] <> '') then begin
      If StrToInt(Item.Caption) >= StrToInt(Item.SubItems[0]) then
        TListView(Sender).Canvas.Brush.Color := clRed
      else TListView(Sender).Canvas.Brush.Color := clGreen;
    end;
  end;
end;
В моем примере раскрашиваются только две первые колонки ListView::Report. Если их больше, надеюсь дополните код сами.

P.S. В первый раз столкнулся с раскраской ListView и страшно удивился что параметр SubItem нумеруется с 1, а не с 0.
northener вне форума Ответить с цитированием
Старый 08.03.2017, 09:34   #7
nibufep
Форумчанин
 
Регистрация: 02.08.2014
Сообщений: 476
По умолчанию

Извиняюсь, я наверное, не правильно объяснил... Под первыми 2 столбиками, я имел ввиду SubItems[0] и SubItems[1], а не Caption.
Код:
procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
  TListView(Sender).Canvas.Brush.Color := clWhite;
  if (Item.SubItems[0] <> '') and (Item.SubItems[1] <> '') then
  begin
    if StrToInt(Item.SubItems[0]) <= StrToInt(Item.SubItems[1]) then
      TListView(Sender).Canvas.Brush.Color := clRed
    else
      TListView(Sender).Canvas.Brush.Color := clGreen;
  end;
end;
 
procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView; Item: TListItem; SubItem: Integer; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
  TListView(Sender).Canvas.Brush.Color := clWhite;
  if SubItem = 1 then
  begin
    if (Item.SubItems[0] <> '') and (Item.SubItems[1] <> '') then
    begin
      if StrToInt(Item.SubItems[0]) >= StrToInt(Item.SubItems[1]) then
        TListView(Sender).Canvas.Brush.Color := clRed
      else
        TListView(Sender).Canvas.Brush.Color := clGreen;
    end;
  end;
end;
Если сделать так - то работать не будет.
nibufep вне форума Ответить с цитированием
Старый 08.03.2017, 12:12   #8
Filka
Форумчанин
 
Регистрация: 29.10.2015
Сообщений: 273
По умолчанию

Код:
procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: Integer; State: TCustomDrawState;
  var DefaultDraw: Boolean);
var
  I, J: Integer;
  AColor: TColor;
begin
  if (SubItem = 1) or (SubItem = 2) then
    if TryStrToInt(Item.SubItems[0], I) and TryStrToInt(Item.SubItems[1], J) then
    begin
      case SubItem of
        1:
          begin
            if I > J then
              AColor := clGreen
            else if I <= J then
              AColor := clRed
          end;
        2:
          begin
            if I >= J then
              AColor := clRed
            else if I < J then
              AColor := clGreen
          end;
      end;
      ListView1.Canvas.Brush.Color := AColor;
    end;
end;

Последний раз редактировалось Filka; 08.03.2017 в 15:29.
Filka вне форума Ответить с цитированием
Старый 08.03.2017, 18:02   #9
nibufep
Форумчанин
 
Регистрация: 02.08.2014
Сообщений: 476
По умолчанию

Цитата:
Сообщение от Filka Посмотреть сообщение
Код:
procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: Integer; State: TCustomDrawState;
  var DefaultDraw: Boolean);
var
  I, J: Integer;
  AColor: TColor;
begin
  if (SubItem = 1) or (SubItem = 2) then
    if TryStrToInt(Item.SubItems[0], I) and TryStrToInt(Item.SubItems[1], J) then
    begin
      case SubItem of
        1:
          begin
            if I > J then
              AColor := clGreen
            else if I <= J then
              AColor := clRed
          end;
        2:
          begin
            if I >= J then
              AColor := clRed
            else if I < J then
              AColor := clGreen
          end;
      end;
      ListView1.Canvas.Brush.Color := AColor;
    end;
end;

Окрашивается или только первый или только второй, в зависимости от того в каком порядке они были заполнены.
nibufep вне форума Ответить с цитированием
Старый 08.03.2017, 18:20   #10
Filka
Форумчанин
 
Регистрация: 29.10.2015
Сообщений: 273
По умолчанию

Где ваши наработки?
Filka вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Границы ячеек ListView Replicant Компоненты Delphi 2 11.11.2016 22:31
Подсветка активной ячейки/диапазона ячеек beal Microsoft Office Excel 18 26.12.2013 12:16
ASP Подсветка ячеек в Гриде Claster Помощь студентам 0 05.09.2011 12:04
Уникальная подсветка повторяющихся ячеек serjufa Microsoft Office Excel 4 04.05.2011 07:08
Подсветка выделенных ячеек-ограничить диапазон Uralmaster Microsoft Office Excel 7 01.02.2011 10:24