|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
TreeView и TreeViewCustomDrawItem
Добра всем.
Встала задачка выделять цветом те дочерние ветви которые в чекбоксах отмечены галками. Сделал. Но пропали + - в узелках!! Пробывал в конце прорисовки своей ставить чёрный цвет - не помогает, но я и на белый не меняю ничего чтобы пропала по фону прорисовка. Просматривал параметры дерева перед этим - может какую галочку поставил/снял.. Вот код: Код:
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
|
|||
|
|||
Цитата:
|