Recent

Author Topic: Ttreeview, how to retrieve data  (Read 5089 times)

julgus

  • New Member
  • *
  • Posts: 29
Ttreeview, how to retrieve data
« on: October 12, 2016, 04:15:59 pm »
I add data in my treeview using
Code: Pascal  [Select][+][-]
  1. procedure TForm2.Button3Click(Sender: TObject);
  2. var
  3. filer:filer_def;
  4.  
  5. begin
  6.   filer:=filer_def.create('some data'+inttostr(random(255)),true);
  7.   form2.Treeview1.Items.AddChildObject(Treeview1.Selected ,'some nodetext',filer);
  8. end;          
  9.  
where filer_def is a defined class.

How do I retrieve the object info in my
Code: Pascal  [Select][+][-]
  1. procedure TForm2.TreeView1Click(Sender: TObject);
  2. begin
  3.  
procedure?

howardpc

  • Hero Member
  • *****
  • Posts: 4144
Re: Ttreeview, how to retrieve data
« Reply #1 on: October 12, 2016, 07:33:15 pm »
Here's a simple example, on a form where I've dropped a treeview, a button and a label.
You would have to adapt it for your actual filer_def implementation.
You have to make sure you free all the filer instances you create, either by visiting each node and freeing any data found there, or by keeping a separate list of filers (as here) and freeing them when the containing form is destroyed, which involves some duplication buts suits a simple example.

Code: Pascal  [Select][+][-]
  1. unit mainTreeviewData;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8.   SysUtils, Forms, ComCtrls, StdCtrls, Classes, LazLogger;
  9.  
  10. type
  11.  
  12.   { TFiler_def }
  13.  
  14.   TFiler_def = class(TObject)
  15.   private
  16.     FName: string;
  17.   public
  18.     constructor Create;
  19.     property Name: string read FName;
  20.   end;
  21.  
  22.   { TForm2 }
  23.  
  24.   TForm2 = class(TForm)
  25.     Button3: TButton;
  26.     NodeDataLabel: TLabel;
  27.     TreeView1: TTreeView;
  28.     procedure Button3Click(Sender: TObject);
  29.     procedure FormCreate(Sender: TObject);
  30.     procedure TreeView1Deletion(Sender: TObject; Node: TTreeNode);
  31.     procedure TreeView1SelectionChanged(Sender: TObject);
  32.   end;
  33.  
  34. var
  35.   Form2: TForm2;
  36.  
  37. implementation
  38.  
  39. const
  40.   id: integer = 0;
  41.  
  42. {$R *.lfm}
  43.  
  44. { TForm2 }
  45.  
  46. procedure TForm2.FormCreate(Sender: TObject);
  47. begin
  48.   TreeView1.Options:=TreeView1.Options + [tvoAutoExpand];
  49. end;
  50.  
  51. procedure TForm2.TreeView1Deletion(Sender: TObject; Node: TTreeNode);
  52. begin
  53.   TFiler_def(Node.Data).Free;
  54. end;
  55.  
  56. procedure TForm2.TreeView1SelectionChanged(Sender: TObject);
  57. var
  58.   tv: TTreeView absolute Sender;
  59.   filer: TFiler_def;
  60. begin
  61.   if (Sender is TTreeView) and (tv.Selected <> nil) then begin
  62.     if (tv.Selected.Data = nil) then
  63.       NodeDataLabel.Caption:='[no data]'
  64.     else begin
  65.       filer:=TFiler_def(tv.Selected.Data);
  66.       NodeDataLabel.Caption:=filer.Name;
  67.     end;
  68.   end;
  69. end;
  70.  
  71. procedure TForm2.Button3Click(Sender: TObject);
  72. var
  73.   filer: TFiler_def;
  74. begin
  75.   filer:=TFiler_def.Create;
  76.   Treeview1.Items.AddChildObject(Treeview1.Selected, filer.Name, filer);
  77. end;
  78.  
  79.  
  80. { TFiler_def }
  81.  
  82. constructor TFiler_def.Create;
  83. begin
  84.   inherited Create;
  85.   Str(id, FName);
  86.   FName:='TFiler_def #' + FName;
  87.   Inc(id);
  88. end;
  89.  
  90. end.
« Last Edit: October 12, 2016, 09:35:23 pm by howardpc »

Zoran

  • Hero Member
  • *****
  • Posts: 1988
    • http://wiki.lazarus.freepascal.org/User:Zoran
Re: Ttreeview, how to retrieve data
« Reply #2 on: October 12, 2016, 08:03:17 pm »
You have to make sure you free all the filer instances you create, either by visiting each node and freeing any data found there, or by keeping a separate list of filers (as here) and freeing them when the containing form is destroyed, which involves some duplication buts suits a simple example.

You can also use TTreeView.OnDeletion event (see here: http://wiki.freepascal.org/TTreeView#Freeing_TreeNode_Data).
Swan, ZX Spectrum emulator https://github.com/zoran-vucenovic/swan

julgus

  • New Member
  • *
  • Posts: 29
Re: Ttreeview, how to retrieve data
« Reply #3 on: October 12, 2016, 09:28:42 pm »
Nicely done! Thanks!  :D

Here's a simple example, on a form where I've dropped a treeview, a button and a label.
You would have to adapt it for your actual filer_def implementation.
You have to make sure you free all the filer instances you create, either by visiting each node and freeing any data found there, or by keeping a separate list of filers (as here) and freeing them when the containing form is destroyed, which involves some duplication buts suits a simple example.

Code: Pascal  [Select][+][-]
  1. unit mainTreeviewData;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8.   SysUtils, Forms, ComCtrls, StdCtrls, Classes, LazLogger;
  9.  
  10. type
  11.  
  12.   { TFiler_def }
  13.  
  14.   TFiler_def = class(TObject)
  15.   private
  16.     FName: string;
  17.   public
  18.     constructor Create;
  19.     property Name: string read FName;
  20.   end;
  21.  
  22.   { TForm2 }
  23.  
  24.   TForm2 = class(TForm)
  25.     Button3: TButton;
  26.     NodeDataLabel: TLabel;
  27.     TreeView1: TTreeView;
  28.     procedure Button3Click(Sender: TObject);
  29.     procedure FormCreate(Sender: TObject);
  30.     procedure FormDestroy(Sender: TObject);
  31.     procedure TreeView1SelectionChanged(Sender: TObject);
  32.   private
  33.     FFilers: array of TFiler_def;
  34.   end;
  35.  
  36. var
  37.   Form2: TForm2;
  38.  
  39. implementation
  40.  
  41. const
  42.   id: integer = 0;
  43.  
  44. {$R *.lfm}
  45.  
  46. { TForm2 }
  47.  
  48. procedure TForm2.FormCreate(Sender: TObject);
  49. begin
  50.   TreeView1.Options:=TreeView1.Options + [tvoAutoExpand];
  51. end;
  52.  
  53. procedure TForm2.FormDestroy(Sender: TObject);
  54. var
  55.   f: TFiler_def;
  56. begin
  57.   for f in FFilers do
  58.     f.Free;
  59. end;
  60.  
  61. procedure TForm2.TreeView1SelectionChanged(Sender: TObject);
  62. var
  63.   tv: TTreeView absolute Sender;
  64.   filer: TFiler_def;
  65. begin
  66.   if (Sender is TTreeView) and (tv.Selected <> nil) then begin
  67.     if (tv.Selected.Data = nil) then
  68.       NodeDataLabel.Caption:='[no data]'
  69.     else begin
  70.       filer:=TFiler_def(tv.Selected.Data);
  71.       NodeDataLabel.Caption:=filer.Name;
  72.     end;
  73.   end;
  74. end;
  75.  
  76. procedure TForm2.Button3Click(Sender: TObject);
  77. begin
  78.   SetLength(FFilers, Length(FFilers)+1);
  79.   FFilers[High(FFilers)]:=TFiler_def.Create;
  80.   Treeview1.Items.AddChildObject(Treeview1.Selected,
  81.                                  FFilers[High(FFilers)].Name,
  82.                                  FFilers[High(FFilers)]);
  83. end;
  84.  
  85.  
  86. { TFiler_def }
  87.  
  88. constructor TFiler_def.Create;
  89. begin
  90.   inherited Create;
  91.   Str(id, FName);
  92.   FName:='TFiler_def #' + FName;
  93.   Inc(id);
  94. end;
  95.  
  96. end.

howardpc

  • Hero Member
  • *****
  • Posts: 4144
Re: Ttreeview, how to retrieve data
« Reply #4 on: October 12, 2016, 09:36:19 pm »
Taking Zoran's hint, I've edited the code above to use the OnDeletion event which simplifies things.

mangakissa

  • Hero Member
  • *****
  • Posts: 1131
Re: Ttreeview, how to retrieve data
« Reply #5 on: October 14, 2016, 08:36:10 am »
Please, use this naming convention. It reads your code a lot easier.
It's not an obligation.
Lazarus 2.06 (64b) / FPC 3.0.4 / Windows 10
stucked on Delphi 10.3.1

Zoran

  • Hero Member
  • *****
  • Posts: 1988
    • http://wiki.lazarus.freepascal.org/User:Zoran
Re: Ttreeview, how to retrieve data
« Reply #6 on: October 14, 2016, 05:33:58 pm »
Please, use this naming convention. It reads your code a lot easier.
It's not an obligation.

It's just a matter of taste. I don't like putting begin in its own line.

I always use

Code: Pascal  [Select][+][-]
  1. if ... then begin
  2.   ...
  3. end else begin
  4.   ...
  5. end;
  6.  

This is in my opinion nicer and more readable.
Anyway, the only thing that is actually important is to be consistent, and if you are, no one can say the coding style is less readable, but nothing more than just a matter of taste.
Swan, ZX Spectrum emulator https://github.com/zoran-vucenovic/swan

 

TinyPortal © 2005-2018