24.03.2024, 20:30
|
Модератор
|
|
Регистрация: 17.04.2008
Сообщения: 8,020
Версия 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. При включенных темах тоже все отрисовывается нормально. Правда там еще фон картинок заливается цветом.
|