Показать сообщение отдельно
  #2  
Старый 24.03.2024, 20:30
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, у меня вот такой код работает (Delphi XE3):
Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.ImgList;

type
  TForm1 = class(TForm)
    tvData: TTreeView;
    ilData: TImageList;
    procedure FormCreate(Sender: TObject);
    procedure tvDataCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode;
      State: TCustomDrawState; var DefaultDraw: Boolean);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
const
  cNodes : Array [1..4] Of String = ('00856','01006','01041','01046');
  cNodeNameTail = '_(some_text)';
  cSubNodeName = '1616';
var
  I, J, CheckCount : Integer;
  ANode, AChildNode : TTreeNode;
begin
  // Init Tree View
  for I := Low(cNodes) to High(cNodes) do
    begin
      ANode := tvData.Items.AddChild(Nil,cNodes[i] + cNodeNameTail);
      ANode.ImageIndex := 0;
      ANode.SelectedIndex := 0;
      CheckCount := 0;
      for J := 1 to 9 do
        begin
          AChildNode := tvData.Items.AddChild(ANode,Format('%s_(%d)',[cSubNodeName,J]));
          AChildNode.ImageIndex := 1;
          AChildNode.SelectedIndex := 1;
          if I = cAllSelectedNodeIdx
            then AChildNode.StateIndex := 3
            else AChildNode.StateIndex := Random(2)+2;
          if AChildNode.StateIndex = 3 then Inc(CheckCount);
        end;
      if CheckCount > 0 then ANode.StateIndex := 3;
    end;
  tvData.Items[0].Expand(True);
end;

procedure TForm1.tvDataCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode;
  State: TCustomDrawState; var DefaultDraw: Boolean);
var
  I, CheckCount, ItemCount : Integer;
  BrushColor : TColor;
  ANode : TTreeNode;
begin
  ItemCount := 0;
  CheckCount := 0;
  ANode := Node.GetFirstChild;
  while ANode <> Nil do
    begin
      Inc(ItemCount);
      if ANode.StateIndex = 3 Then Inc(CheckCount);
      ANode := Node.GetNextChild(ANode);
    end;
  if ItemCount = 0
    then
      begin
        if Node.StateIndex = 3
          then BrushColor := clLime
          else BrushColor := clWindow;
      end
    else
      begin
        if CheckCount = 0 then BrushColor := clWindow;
        if (CheckCount > 0) And (CheckCount < ItemCount) then BrushColor := RGB(180,255,180);
        if (CheckCount > 0) And (CheckCount = ItemCount) then BrushColor := clLime;
      end;

  if Not Node.Selected then
    Sender.Canvas.Brush.Color := BrushColor;

  DefaultDraw := True;
end;

end.

В настройках проекта темы отключены (что бы отрисовывались старые "плюсики" на узлах). В ImageList (ilData) 4 картинки - папка, документ, пустой квадрат, квадрат с галочкой. И idData назначен для обеих свойств дерева Images и StateImages.

EDIT. При включенных темах тоже все отрисовывается нормально. Правда там еще фон картинок заливается цветом.
Ответить с цитированием