Table of Contents

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;