![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Добра всем.
Встала задачка выделять цветом те дочерние ветви которые в чекбоксах отмечены галками. Сделал. Но пропали + - в узелках!! Пробывал в конце прорисовки своей ставить чёрный цвет - не помогает, но я и на белый не меняю ничего чтобы пропала по фону прорисовка. Просматривал параметры дерева перед этим - может какую галочку поставил/снял.. Вот код: Код:
procedure TSDIAppForm.TreeViewZakazCustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
var
iich:integer; // данные проверки ноды на отметку
jj:integer; // cчетчик отмеченных нод
prnode:TTreeNode; // родительская нода
begin
with Sender.Canvas do
begin
Font.Color := clWindowText;
prnode:=node.Parent; // берём родительскую ноду
if prnode=nil then // проверяем - это родительская?
begin // если родительская то красим по разному
jj:=0;
prnode:= node.getFirstChild;
while Assigned(prnode) do //Перебираем дочерние на хотябы одну снятую
begin // чтобы главную закрасить светлее
iich:=ItTESTChecked(prnode);
if iich<=100 then // если хотябы один НЕстоит
begin
jj:=255; // признак того что есть хотябы одна дочерняя нода
end;
prnode := node.GetNextChild(prnode);
end;
iich:=ItTESTChecked(Node); // если первая нода отмечена то красим зелёным фон
if ((iich=200)and(jj=0)) then Brush.Color:= clLime;
if ((iich=200)and(jj=255)) then Brush.Color:= RGB(188,255,188); // светлая закраска не полной главной ноды
if node.Selected then // выделенная нода серая
begin
Brush.Color:= clMenuHighlight;
Font.Color := clWindow;
end;
end else // если нода НЕ родительская
begin
iich:=ItTESTChecked(Node); // если нода отмечена то красим зелёным фон
if iich=200 then
Brush.Color:= clLime;
if iich<=100 then // если НЕ отмечена то белый фон
Brush.Color:= clWindow;
if node.Selected then // выделенная нода серая
begin
Brush.Color:= clMenuHighlight;
Font.Color := clWindow;
end;
end;
Pen.Color:= clWindowText;
//Brush.Color:= clMenuHighlight;
end;
end;
Последний раз редактировалось -=#PupaJr#=-, 23.03.2024 в 10:01. |
|
#2
|
|||
|
|||
|
Ну, у меня вот такой код работает (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. При включенных темах тоже все отрисовывается нормально. Правда там еще фон картинок заливается цветом. Последний раз редактировалось lmikle, 25.03.2024 в 00:43. |
| Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
-=#PupaJr#=- (31.03.2024)
| ||
|
#3
|
|||
|
|||
|
Спасибо!
Странно как-то всё это работает, описания толком не нашёл. Я вот только-только решил так - просто удалил дерево и заново сделал с теми настройками которые точно нужны были - и о чудо - плюсики есть и всё работает с цветами.. так и не понял что это было такое.. |
|
#4
|
|||
|
|||
|
Спасибо!
Странно как-то всё это работает, описания толком не нашёл. Я вот только-только решил так - просто удалил дерево и заново сделал с теми настройками которые точно нужны были - и о чудо - плюсики есть и всё работает с цветами.. так и не понял что это было такое.. Node.StateIndex = 3 - проверка на чекбокс ?? |
|
#5
|
|||
|
|||
|
Цитата:
|