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.
unit mainTreeviewData;
{$mode objfpc}{$H+}
interface
uses
SysUtils, Forms, ComCtrls, StdCtrls, Classes, LazLogger;
type
{ TFiler_def }
TFiler_def = class(TObject)
private
FName: string;
public
constructor Create;
property Name: string read FName;
end;
{ TForm2 }
TForm2 = class(TForm)
Button3: TButton;
NodeDataLabel: TLabel;
TreeView1: TTreeView;
procedure Button3Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure TreeView1Deletion(Sender: TObject; Node: TTreeNode);
procedure TreeView1SelectionChanged(Sender: TObject);
end;
var
Form2: TForm2;
implementation
const
id: integer = 0;
{$R *.lfm}
{ TForm2 }
procedure TForm2.FormCreate(Sender: TObject);
begin
TreeView1.Options:=TreeView1.Options + [tvoAutoExpand];
end;
procedure TForm2.TreeView1Deletion(Sender: TObject; Node: TTreeNode);
begin
TFiler_def(Node.Data).Free;
end;
procedure TForm2.TreeView1SelectionChanged(Sender: TObject);
var
tv: TTreeView absolute Sender;
filer: TFiler_def;
begin
if (Sender is TTreeView) and (tv.Selected <> nil) then begin
if (tv.Selected.Data = nil) then
NodeDataLabel.Caption:='[no data]'
else begin
filer:=TFiler_def(tv.Selected.Data);
NodeDataLabel.Caption:=filer.Name;
end;
end;
end;
procedure TForm2.Button3Click(Sender: TObject);
var
filer: TFiler_def;
begin
filer:=TFiler_def.Create;
Treeview1.Items.AddChildObject(Treeview1.Selected, filer.Name, filer);
end;
{ TFiler_def }
constructor TFiler_def.Create;
begin
inherited Create;
Str(id, FName);
FName:='TFiler_def #' + FName;
Inc(id);
end;
end.