title: How to delete a node and its object from a TTreeView
body: <p>I am using Delphi 10 Starter edition.  I am studying how to use Delphi's <code>TTreeView</code> component.</p>
  
  <p>Everything works, no issues. The only question I have left is:</p>
  
  <p>After adding an object to a node, what is the right way to delete the item and its object?</p>
  
  <p>Here is my code (see <code>Button6Click</code>):</p>
  
  <pre><code>type
    TMyNode2 = class
    public
      nom: Integer;
      comm: String;
    end;
  
  var
    Form1: TForm1;
    MyNode2: TMyNode2;
  
  procedure TForm1.Button1Click(Sender: TObject); // add node
  var
    x: TTreeNode;
  begin
    x := tv1.Items.Add(tv1.Selected, Edit1.Text + ' ' + IntToStr(Round(Random(100))));
    x.ImageIndex := 1;
    x.SelectedIndex := x.ImageIndex;
    x.StateIndex := x.ImageIndex;
  end;
  
  procedure TForm1.Button4Click(Sender: TObject); // add child node
  var
    x: TTreeNode;
  begin
    x := tv1.Items.AddChild(tv1.Selected, 'Child ' + Edit1.Text + ' ' + IntToStr(Round(Random(100))));
    x.ImageIndex := 2;
    x.SelectedIndex := x.ImageIndex;
    x.StateIndex := x.ImageIndex;
    tv1.Selected.Expand(true);
    x.Selected := true;
    x.Expand(true);
  end;
  
  procedure TForm1.Button2Click(Sender: TObject); // del node (if not 1st)
  var
    x, y: TTreeNode;
  begin
    y := tv1.Items[0];
    x := tv1.Selected;
    if x &lt;&gt; y then
      x.Delete
    else
      ShowMessage('Do not del 1st node!');
  end;
  
  procedure TForm1.Button3Click(Sender: TObject); // add node (v.2 as object)
  var
    x: TTreeNode;
  begin
    MyNode2 := TMyNode2.Create;
    MyNode2.nom := Round(Random(1000));
    MyNode2.comm := IntToStr(MyNode2.nom) + ' comment ' + IntToStr(MyNode2.nom);
    x := tv1.Items.AddObject(tv1.Selected, Edit1.Text + ' ' + IntToStr(Round(Random(1000))), Pointer(MyNode2)); 
    x.ImageIndex := 3;
    x.SelectedIndex := x.ImageIndex;
    x.StateIndex := x.ImageIndex;
    tv1.Selected.Expand(true);
    x.Selected := true;
    x.Expand(true);
  end;
  
  procedure TForm1.Button5Click(Sender: TObject); // add child node (v.2 as object)
  var
    x: TTreeNode;
  begin
    MyNode2 := TMyNode2.Create;
    MyNode2.nom := Round(Random(1000));
    MyNode2.comm := IntToStr(MyNode2.nom) + ' child comment ' + IntToStr(MyNode2.nom);
    x := tv1.Items.AddChildObject(tv1.Selected, Edit1.Text + ' ' + IntToStr(Round(Random(1000))), Pointer(MyNode2));
    x.ImageIndex := 4;
    x.SelectedIndex := x.ImageIndex;
    x.StateIndex := x.ImageIndex;
    tv1.Selected.Expand(true);
    x.Selected := true;
    x.Expand(true);
  end;
  
  procedure TForm1.Button6Click(Sender: TObject); // del node (if not 1st) and "as" object
  var
    x, y: TTreeNode;
  begin
    y := tv1.Items[0];
    x := tv1.Selected;
    if x &lt;&gt; y then begin
      //class(x.tMyNode2(node.Data)).Free; // **** // !!!!!!!!!!!!!!!
      x.Delete;
    end else
      ShowMessage('Do not del 1st node!');
  end;
  
  procedure TForm1.FormCreate(Sender: TObject); // on create - add data 2 1st node
  var
    x: TTreeNode;
  begin
    MyNode2 := TMyNode2.Create;
    MyNode2.nom := 100001;
    MyNode2.comm := '1st node comment';
    x := tv1.Items[0];
    x.Data := Pointer(MyNode2);
  end;
  
  procedure TForm1.tv1Change(Sender: TObject; Node: TTreeNode); // look node prop.
  begin
    if Node = nil then
      Caption:='Not select'
    else
    if Node.Data = nil then
      Caption := Format('Nom: %d, Im.Ind: %d', [Integer(Node.Index), Integer(Node.ImageIndex)])
    else
      Caption := Format('Nom: %d, Im.Ind: %d, MyNode.Nom: %d, Comm: %s', [Integer(Node.Index), Integer(Node.ImageIndex), Integer(TMyNode2(node.Data).nom), string(TMyNode2(node.Data).comm)]);
  end;
  </code></pre>