Recent

Author Topic: [SOLVED] TreevView - Remove All Nodes  (Read 2486 times)

pixelink

  • Hero Member
  • *****
  • Posts: 1269
[SOLVED] TreevView - Remove All Nodes
« on: August 07, 2019, 09:25:30 pm »
I found this page on the wiki...
https://wiki.lazarus.freepascal.org/TTreeView

I used the code suggested to delete all nodes.
Get an error. saying...

TreeView1.Items.Delete(Node)  (--> NOT FOUND)

And yet, my control's name is TreeView1

Why does it say not found?

Obviously wiki is missing some code.

Code: Pascal  [Select][+][-]
  1. //A procedure to recursively delete nodes
  2. procedure DeleteNode(Node:TTreeNode);
  3. begin
  4.   while Node.HasChildren do
  5.     begin
  6.        DeleteNode(node.GetLastChild);
  7.        TreeView1.Items.Delete(Node); //<-- ERROR
  8.     end;
  9. end;
  10.  
  11. procedure TForm1.mnuNewClick(Sender: TObject);
  12. var
  13.    Node:TTreeNode;
  14. begin
  15.   if TreeView1.Selected = nil then
  16.     exit;
  17.  
  18.   //if selected node has child nodes, first ask for confirmation
  19.   if treeview1.Selected.HasChildren then
  20.     if messagedlg( 'Delete node and all children ?',mtConfirmation, [mbYes,mbNo],0 ) <> mrYes then
  21.       exit;
  22.  
  23.   DeleteNode(TreeView1.Selected);
  24.  
  25.   //add a new root node - I added this code
  26.   Treeview1.Items.Add (nil,'Root Node');
  27.  
  28. end;
  29.  


Thanks

end;
« Last Edit: August 07, 2019, 09:33:21 pm by pixelink »
Can't Type - Forgetful - Had Stroke = Forgive this old man!
LAZ 4.2.0 •  VSSTUDIO(.Net) 2022 • Win11 • 32G RAM • Nvida RTX 4070 Ti Super

pixelink

  • Hero Member
  • *****
  • Posts: 1269
Re: TreevView - Remove All Nodes
« Reply #1 on: August 07, 2019, 09:33:06 pm »
I hat that when that happens...
 I post a thread then figure it out.

I needed to insert Form1.TreeView1
Because it in a procedure.

Code that works now...

Code: Pascal  [Select][+][-]
  1.  
  2. //A procedure to recursively delete nodes
  3. procedure TForm1.DeleteNode(Node:TTreeNode);
  4. begin
  5.   while Node.HasChildren do
  6.     begin
  7.        DeleteNode(node.GetLastChild);
  8.        Form1.TreeView1.Items.Delete(Node); //<-- ERROR
  9.     end;
  10. end;
  11.  
  12. procedure TForm1.mnuNewClick(Sender: TObject);
  13. var
  14.    Node:TTreeNode;
  15. begin
  16.   if TreeView1.Selected = nil then
  17.     exit;
  18.  
  19.   //if selected node has child nodes, first ask for confirmation
  20.   if treeview1.Selected.HasChildren then
  21.     if messagedlg( 'Delete node and all children ?',mtConfirmation, [mbYes,mbNo],0 ) <> mrYes then
  22.       exit;
  23.  
  24.   DeleteNode(TreeView1.Selected);
  25.  
  26.   //add a new root node - I added this code
  27.   Treeview1.Items.Add (nil,'Root Node');
  28.  
  29. end;
  30.  
  31.  
Can't Type - Forgetful - Had Stroke = Forgive this old man!
LAZ 4.2.0 •  VSSTUDIO(.Net) 2022 • Win11 • 32G RAM • Nvida RTX 4070 Ti Super

lucamar

  • Hero Member
  • *****
  • Posts: 4217
Re: [SOLVED] TreevView - Remove All Nodes
« Reply #2 on: August 07, 2019, 11:17:06 pm »
Making the proc a method of form1 should suffice, since then TreeView1 is in scope:
Code: Pascal  [Select][+][-]
  1.  
  2. //A procedure to recursively delete nodes
  3. procedure TForm1.DeleteNode(Node:TTreeNode);
  4. begin
  5.   while Node.HasChildren do
  6.     begin
  7.        DeleteNode(node.GetLastChild);
  8.        TreeView1.Items.Delete(Node); //<-- ERROR
  9.     end;
  10. end;
  11.  
  12. procedure TForm1.mnuNewClick(Sender: TObject);
  13. var
  14.    Node:TTreeNode;
  15. begin
  16.   if TreeView1.Selected = nil then
  17.     exit;
  18.  
  19.   //if selected node has child nodes, first ask for confirmation
  20.   if treeview1.Selected.HasChildren then
  21.     if messagedlg( 'Delete node and all children ?',mtConfirmation, [mbYes,mbNo],0 ) <> mrYes then
  22.       exit;
  23.  
  24.   DeleteNode(TreeView1.Selected);
  25.  
  26.   //add a new root node - I added this code
  27.   Treeview1.Items.Add (nil,'Root Node');
  28.  
  29. end;
Turbo Pascal 3 CP/M - Amstrad PCW 8256 (512 KB !!!) :P
Lazarus/FPC 2.0.8/3.0.4 & 2.0.12/3.2.0 - 32/64 bits on:
(K|L|X)Ubuntu 12..18, Windows XP, 7, 10 and various DOSes.

wp

  • Hero Member
  • *****
  • Posts: 13361
Re: [SOLVED] TreevView - Remove All Nodes
« Reply #3 on: August 07, 2019, 11:32:02 pm »
I found this page on the wiki...
https://wiki.lazarus.freepascal.org/TTreeView

I used the code suggested to delete all nodes.
Get an error. saying...

TreeView1.Items.Delete(Node)  (--> NOT FOUND)

And yet, my control's name is TreeView1

Why does it say not found?

Obviously wiki is missing some code.

This is the wiki code:

Code: Pascal  [Select][+][-]
  1. procedure TForm1.Button2Click(Sender: TObject);
  2.  
  3.     //A procedure to recursively delete nodes
  4.   procedure DeleteNode(Node:TTreeNode);
  5.   begin
  6.     while Node.HasChildren do
  7.       DeleteNode(node.GetLastChild);
  8.     TreeView1.Items.Delete(Node) ;
  9.   end;
  10.  
  11. begin
  12.   if TreeView1.Selected = nil then
  13.     exit;
  14.  
  15.     //if selected node has child nodes, first ask for confirmation
  16.   if treeview1.Selected.HasChildren then
  17.     if messagedlg( 'Delete node and all children ?',mtConfirmation, [mbYes,mbNo],0 ) <> mrYes then
  18.       exit;
  19.   DeleteNode(TreeView1.Selected);
  20. end;

You see here that the procedure "DeleteNode" is nested in TForm1.Button2Click. This means that it lives inside TForm1 like any other TForm1 method and knows everything about TForm1 and its components. You, however, made an non-method procedure out of it, and this removed all the context.

The wiki is fully correct here.
« Last Edit: August 08, 2019, 12:47:27 am by wp »

 

TinyPortal © 2005-2018