Checked Nodes
TTMSFNCCheckedTreeView extends TTMSFNCTreeView with check boxes on nodes. Use it for hierarchical choices where a flat checked list would lose parent-child context.
Populate Nodes
Create nodes with the normal tree API, then set Checked[Node] for the initial state. Checked tree node values default to check boxes, so each node is ready for selection.
procedure TForm1.ConfigureCheckedTreeView;
var
RootNode: TTMSFNCTreeViewNode;
ChildNode: TTMSFNCTreeViewNode;
begin
TMSFNCCheckedTreeView1.Clear;
RootNode := TMSFNCCheckedTreeView1.AddNode;
RootNode.Text[0] := 'Export';
TMSFNCCheckedTreeView1.Checked[RootNode] := True;
ChildNode := TMSFNCCheckedTreeView1.AddNode(RootNode);
ChildNode.Text[0] := 'Include images';
TMSFNCCheckedTreeView1.Checked[ChildNode] := True;
ChildNode := TMSFNCCheckedTreeView1.AddNode(RootNode);
ChildNode.Text[0] := 'Include audit trail';
end;
Read Checked Nodes
Use CheckedNodes to collect checked nodes. The optional ARecurse argument controls whether child nodes are included recursively.
procedure TForm1.ShowCheckedNodes;
var
Nodes: TTMSFNCTreeViewCheckedNodes;
Node: TTMSFNCTreeViewNode;
Summary: string;
begin
Nodes := TMSFNCCheckedTreeView1.CheckedNodes(0, True);
Summary := '';
for Node in Nodes do
begin
if Summary <> '' then
Summary := Summary + ', ';
Summary := Summary + Node.Text[0];
end;
ShowMessage(Summary);
end;
Combining hierarchy, checked state, and recursive collection
Keep tree structure and checked state together in one setup routine when the checked hierarchy mirrors an application feature set. This makes later collection predictable because each checked node already carries the display text that users saw:
procedure TForm1.FormCreate(Sender: TObject);
var
grpNode, childNode: TTMSFNCTreeViewNode;
begin
TMSFNCCheckedTreeView1.BeginUpdate;
TMSFNCCheckedTreeView1.Options.Interaction.RecursiveChecked := True;
grpNode := TMSFNCCheckedTreeView1.AddNode(nil);
grpNode.Text[0] := 'Reporting';
grpNode.Checked := True; // checks all children automatically
childNode := TMSFNCCheckedTreeView1.AddNode(grpNode);
childNode.Text[0] := 'Daily summary';
childNode := TMSFNCCheckedTreeView1.AddNode(grpNode);
childNode.Text[0] := 'Weekly digest';
childNode.Checked := False; // override: this one stays unchecked
TMSFNCCheckedTreeView1.EndUpdate;
end;
procedure TForm1.btnCollectClick(Sender: TObject);
var
nodes: TArray<TTMSFNCTreeViewNode>;
begin
nodes := TMSFNCCheckedTreeView1.CheckedNodes(True); // recurse
for var n in nodes do
Memo1.Lines.Add(n.Text[0]);
end;