# TTreeView

English (en) español (es) suomi (fi) français (fr) magyar (hu)

A TTreeView is a graphical control element that presents a hierarchical view of information. Each item can have a number of subitems.

An item can be expanded to reveal subitems, if any exist, and collapsed to hide subitems.

## Creating a TreeView which loads items only when expansing

To add the expansion symbol to a node without subitems use:

MyNode.HasChildren := True;

And then set an event handler for the OnExpanding event. In this even you should return if the expansion can actually be made or not and when yes, you should add subitems to the node. If the expansion cannot be done, the expansion symbol will be automatically removed even if you have previously set HasChildren to true.

## A Short example of using TTreeview

Here is a quick & dirty example - I tested on Windows Lazarus 0.9.26:

Create a new application. On Form1 add an empty treeview, a button1 with caption "Add Child" and a button2 with caption "Delete"

For the buttons' OnClick events, assign the following code, compile & run.

Code:

procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
s: string;
begin
// if there are no nodes, create a root node with a parent of nil
if TreeView1.Items.Count = 0 then
begin
exit;
end;

// Set up a simple text for each new node - Node1 , Node2 etc
i := treeview1.Items.Count;
s := 'Node ' + inttostr(i);
//Add a new node to the currently selected node
if TreeView1.Selected <> nil then
end;

procedure TForm1.Button2Click(Sender: TObject);

//A procedure to recursively delete nodes
procedure DeleteNode(Node:TTreeNode);
begin
while Node.HasChildren do
DeleteNode(node.GetLastChild);
TreeView1.Items.Delete(Node) ;
end;

begin
if TreeView1.Selected = nil then
exit;

//if selected node has child nodes, first ask for confirmation
if treeview1.Selected.HasChildren then
if messagedlg( 'Delete node and all children ?',mtConfirmation, [mbYes,mbNo],0 ) <> mrYes then
exit;
DeleteNode(TreeView1.Selected);
end;

When running, the treeview is empty. If you click "Add Child", a root node is created. After that a child will be added to any selected node by clicking "Add Child"

Delete will delete the currently selected node. If it doesn't have children, it will delete it immediately, but if it has children, it will first ask.

## Example of using Multiple Node Selection for Multiple User Selections

If you select your TTreeview component, go to the object inspector and in the options sections set 'tvoAllowMultiSelect' to true. Then, to iterate over the selected nodes and obtain the paths of the chosen folders or files, the following example will populate the text paths of those selected nodes to a memo field :

Code:

procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
if TreeView1.SelectionCount=0 then
exit;
Memo1.Lines.Clear;
for i:=0 to TreeView1.SelectionCount-1 do
end;

## Freeing TreeNode Data

Use the TreeView's OnDeletion event to free your object.

procedure TForm1.TreeView1Deletion(Sender: TObject; Node: TTreeNode);
begin
TMyObject(Node.Data).Free;
end;

## Using Drag and Drop in a TreeView

If you want to allow a drag and drop function in your treeview, you need to :

1. Set to DmAutomatic, the property "Drag Mode" of your treeview
2. Create an event for "OndragOver":
procedure TForm1.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;  State: TDragState; var Accept: Boolean);
begin
Accept := true;
end;