TTreeView
Adding a new item in code
Use TTreeView.Items.AddChild or AddChildObject.
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 is no nodes, create a root node with a parent of Nil if TreeView1.Items.Count = 0 then begin Treeview1.Items.Add (nil,'Root Node'); 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 Treeview1.Items.AddChild(Treeview1.Selected ,s); 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.