Table of Contents

Nodes

Node configuration

The NodesAppearance property on TTMSFNCTreeView controls the visual style of all nodes. Individual columns can override these defaults by setting UseDefaultAppearance = False on a TTMSFNCTreeViewColumn.

Adding, inserting, and removing nodes

Both collection-based and virtual modes are covered in Modes. The snippets here use collection-based mode.

// Start from a clean state
TreeView1.BeginUpdate;
TreeView1.ClearNodeList;
TreeView1.ClearNodes;
TreeView1.ClearColumns;
TreeView1.Columns.Add.Text := 'Column 1';
TreeView1.EndUpdate;

Add a root node:

var n: TTMSFNCTreeViewNode;
n := TreeView1.AddNode;
n.Text[0] := 'Root Node';

Add a child node:

var pn, child: TTMSFNCTreeViewNode;
pn := TreeView1.AddNode;
child := TreeView1.AddNode(pn);  // child of pn
child.Text[0] := 'Child Node';
TreeView1.ExpandNode(pn);
Node with child nodes expanded

Insert a node at a specific position:

TreeView1.InsertNode(1, nil);  // insert at index 1 at root level

Remove nodes:

// By method
TreeView1.RemoveNode(TreeView1.FocusedNode);

// By freeing the collection item — same result
TreeView1.FocusedNode.Free;

// Remove all children of a node
TreeView1.RemoveNodeChildren(someParentNode);

// Remove all selected nodes
TreeView1.RemoveSelectedNodes;

Fixed vs variable node height

Fixed height (default)

All nodes share the same height, set by NodesAppearance.FixedHeight. Icons and text that exceed this height are clipped.

TreeView1.NodesAppearance.FixedHeight := 40;
Fixed height nodes with oversized icons

Variable height

Set NodesAppearance.HeightMode to tnhmVariable to let each node height expand to fit its content (icon size or wrapped text). The NodesAppearance.VariableMinimumHeight sets the minimum height for scroll calculations.

procedure TForm1.SetupVariableHeight;
begin
  TreeView1.BeginUpdate;
  TreeView1.ClearNodeList;
  TreeView1.ClearNodes;
  TreeView1.ClearColumns;
  TreeView1.Columns.Add.Text := 'Variable TreeView';
  TreeView1.Columns[0].WordWrapping := True;
  TreeView1.NodesAppearance.HeightMode := tnhmVariable;
  TreeView1.EndUpdate;
end;
Variable height nodes with oversized icons

With word wrapping enabled, long text also drives the node height:

TreeView1.Columns[0].WordWrapping := True;
TreeView1.NodesAppearance.HeightMode := tnhmVariable;
Variable height nodes with wrapped text

Checkbox and radiobutton support

Each node column can display a checkbox or radiobutton independently via the CheckTypes property:

procedure TForm1.SetupCheckNodes;
var
  n: TTMSFNCTreeViewNode;
  I: Integer;
begin
  TreeView1.BeginUpdate;
  TreeView1.ClearNodeList;
  TreeView1.ClearNodes;
  TreeView1.ClearColumns;
  TreeView1.Columns.Add.Text := 'Checkbox / radiobutton';

  for I := 0 to 3 do
  begin
    n := TreeView1.Nodes.Add;
    n.Text[0] := 'CheckBox ' + IntToStr(I);
    n.CheckTypes[0] := tvntCheckBox;
    if Odd(I) then
      n.Checked[0] := True;
  end;

  for I := 0 to 3 do
  begin
    n := TreeView1.Nodes.Add;
    n.Text[0] := 'Radiobutton ' + IntToStr(I);
    n.CheckTypes[0] := tvntRadioButton;
    if I = 2 then
      n.Checked[0] := True;
  end;

  TreeView1.EndUpdate;
Nodes with checkboxes and radiobuttons

To use virtual mode for checkboxes, implement OnGetNodeCheckType and OnIsNodeChecked.

Toggle check state programmatically:

TreeView1.ToggleCheckNode(node, 0);           // collection-based
TreeView1.CheckVirtualNode(virtualNode, 0);   // virtual

Extended nodes

An extended node spans all columns and displays text from column 0 only. Extended nodes are not selectable or editable by default; this can be changed via NodesAppearance.ExtendedSelectable and NodesAppearance.ExtendedEditable.

Use extended nodes as section headers within a flat list:

// Extended nodes that span all columns
procedure TForm1.SetupExtendedNodes;
var
  n, pn: TTMSFNCTreeViewNode;
  I: Integer;
begin
  TreeView1.BeginUpdate;
  TreeView1.ClearNodeList;
  TreeView1.ClearNodes;
  TreeView1.ClearColumns;
  TreeView1.Columns.Add.Text := 'Column 1';
  TreeView1.Columns.Add.Text := 'Column 2';

  pn := TreeView1.Nodes.Add;
  pn.Text[0] := 'Normal Node';

  pn := TreeView1.Nodes.Add;
  pn.Text[0] := 'Extended Group Header';
  pn.Extended := True;

  for I := 0 to 3 do
  begin
    n := TreeView1.AddNode(pn);
    if I = 1 then
    begin
      n.Text[0] := 'Sub-header ' + IntToStr(I);
      n.Extended := True;
    end
    else
    begin
      n.Text[0] := 'Normal Node Column 1 ' + IntToStr(I);
      n.Text[1] := 'Normal Node Column 2 ' + IntToStr(I);
    end;
  end;

  TreeView1.EndUpdate;
Mix of normal and extended nodes

In virtual mode, return True from OnIsNodeExtended to mark a node as extended.


NodesAppearance reference

Property Description
FixedHeight Node height when HeightMode = tnhmFixed
HeightMode tnhmFixed or tnhmVariable
VariableMinimumHeight Minimum height for variable-height nodes (default 25)
FontColor Default node text color
Font Default node font
Fill, Stroke Default node background and border
SelectedFill, SelectedFontColor Selected state style
DisabledFill, DisabledFontColor Disabled state style
LevelIndent Pixel indent per nesting level
ShowLines Draw tree connector lines
ShowFocus Draw focus indicator
ExpandWidth, ExpandHeight Size of the expand/collapse icon area
SelectionArea tsaFull — full row, or tsaText — text only

See also

  • Modes — virtual vs collection-based approach
  • Interaction — editing nodes, filtering, sorting