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

#delphi #tlistview

#delphi #tlistview

Вопрос:

Я использую 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 отправителя.Холст.Шрифт.Цвет — clBlack, но они отображаются с помощью clRed и clGreen.
Если это проблема в моем коде, пожалуйста, покажите мне, как это исправить.
Если это ошибка, возможно, кто-то знает обходной путь.
Спасибо.

Ответ №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;
  

Комментарии:

1. Спасибо, но это не работает. Как я уже сказал, я проверил, и для подпунктов>= 3 уже установлен clBlack, поэтому установка его на clBlack не имеет никакого эффекта.

2. У меня нет TTNTListView , но это выглядит как расширение стандартного представления списка, TListView . При TListView этом ваш код ведет себя так, как вы описали, и мой код ведет себя правильно, т. Е. Все столбцы черные, кроме столбца 3 (подпункт 2). Итак, если мой код, который работает для меня, не работает для вас, то либо 1. компонент TNT отличается каким-то важным образом, либо 2. у вас есть больше кода, который усложняет проблему. Попробуйте запустить только с представлением списка TNT, используя мой код. Должен быть в состоянии сузить его достаточно легко.

3. Похоже, это 1. Я проверил в отдельной программе: с TListView работает нормально, с TNTListview — нет. Есть идеи ..?

4. Можете ли вы проверить еще раз. Похоже, что элемент управления TNT является производным от стандартного элемента управления Delphi, а событие, которое вы обрабатываете, является событием Delphi. Если он действительно ведет себя по-другому, то, несомненно, это ошибка. В таком случае, почему бы не использовать стандартный компонент?

5. Да, он ведет себя по-другому. И я не могу использовать стандартный компонент, потому что TNT = Unicode, в Delphi 7 стандартный компонент не является Unicode. Для этого проекта я не могу использовать более новую версию Delphi.