Как изменить цвет текста в столбце в TTNTListView?

Я использую TTNTListView в Delphi 7. Для него установлено значение vsReport. В событии OnCustomDrawSubItem я использую этот код:

procedure TForm.ListViewCustomDrawSubItem(Sender: TCustomListView;
   Item: TListItem; SubItem: Integer; State: TCustomDrawState;
   var DefaultDraw: Boolean);
begin
   if SubItem = 2 then
      if (Item.SubItems.Strings[1] = Text1) or (Item.SubItems.Strings[1] = Text2) then
         Sender.Canvas.Font.Color := clGreen
      else
         Sender.Canvas.Font.Color := clRed;
end;

Проблема в том, что все подэлементы >= 3 отрисовываются тем же цветом, что и подэлемент 2. Я проверил, и для SubItem >= 3 Sender.Canvas.Font.Color имеет значение clBlack, но они отрисовываются с помощью clRed и clGreen. Если это проблема в моем коде, пожалуйста, покажите мне, как это исправить. Если это ошибка, может быть, кто-то знает обходной путь. Спасибо.


person DavidB    schedule 08.10.2011    source источник


Ответы (1)


Я предполагаю, что вам просто нужно явно установить цвет для других случаев. Поскольку вы этого не делаете, состояние холста сохраняется. Попробуй это:

procedure TForm.ListViewCustomDrawSubItem(Sender: TCustomListView;
   Item: TListItem; SubItem: Integer; State: TCustomDrawState;
   var DefaultDraw: Boolean);
var
  Color: TColor;
begin
  if SubItem = 2 then
    if (Item.SubItems.Strings[1] = Text1) or (Item.SubItems.Strings[1] = Text2) then
      Color := clGreen
    else
      Color := clRed;
  else
    Color := clBlack;
  Sender.Canvas.Font.Color := Color;
end;
person David Heffernan    schedule 08.10.2011
comment
Спасибо, но это не работает. Как я уже сказал, я проверил, и для SubItems ›= 3 уже есть clBlack, поэтому установка его на clBlack не имеет никакого эффекта. - person DavidB; 08.10.2011
comment
У меня нет TTNTListView, но он выглядит как расширение стандартного представления списка, TListView. С TListView ваш код ведет себя так, как вы описали, и мой код ведет себя правильно, т.е. все столбцы становятся черными, кроме столбца 3 (подпункт 2). Итак, если мой код, который работает у меня, не работает у вас, то либо 1. компонент TNT отличается каким-то важным образом, либо 2. у вас есть дополнительный код, который усложняет проблему. Попробуйте запустить только с представлением списка TNT, используя мой код. Должен быть в состоянии сузить его достаточно легко. - person David Heffernan; 08.10.2011
comment
Вроде 1. Проверил в отдельной программе: с TListView работает нормально, с TNTListview нет. Любые идеи..? - person DavidB; 08.10.2011
comment
Можешь еще раз проверить. Похоже, что элемент управления TNT является производным от стандартного элемента управления Delphi, а событие, которое вы обрабатываете, является событием Delphi. Если он действительно ведет себя по-другому, то, безусловно, это ошибка. В таком случае, почему бы не использовать стандартный компонент? - person David Heffernan; 08.10.2011
comment
Да, ведет себя иначе. И я не могу использовать стандартный компонент, потому что TNT = Unicode, в Delphi 7 стандартный компонент не является Unicode. Для этого проекта я не могу использовать более новую версию Delphi. - person DavidB; 08.10.2011
comment
Я тестировал в Delphi 2009, и с ListView та же проблема. Но я заметил нечто очень странное. Ваш код работает с TNTListView в Delphi 7 и с ListView в Delphi 2009, ТОЛЬКО если в этом случае я использую цвет для Subitem ‹› 2 (последний, который вы добавили), отличный от ListView.Font.Color. Например, если я использую clblack для одного и clWindowText для другого, это работает. Но если я использую один и тот же цвет (любой) для обоих, это не сработает. Хорошо, что частично работает, но мне нужно работать с тем же цветом (скорее всего, я буду использовать clWindowText). - person DavidB; 09.10.2011