每次填充Treeview时,我都想向节点添加信息。 我的意思是,例如,当我创建一个ChildNode时,我想把它与它的kinhsip程度联系起来。 也许属性数据是为此而制作的,但我不知道如何处理它。
答案 0 :(得分:3)
假设您使用的是VCL的TTreeView
组件,而不是FireMonkey的TTreeView
组件或其他第三方树视图,那么处理这种情况的最佳方法是从中获取新类VCL的TTreeNode
课程并为其添加自定义字段以保留所需的值,然后您可以使用TTreeView.OnCreateNodeClass
事件让TTreeView
创建您的课程实例:
type
TMyTreeNode = class(TTreeNode)
public
Toto: Real;
end;
procedure TMyForm.TreeView1CreateNodeClass(Sender: TCustomTreeView; var NodeClass: TTreeNodeClass);
begin
NodeClass := TMyTreeNode;
end;
然后,每当您添加新节点或需要检索现有节点的自定义值时,您只需键入一个TTreeNode
指向TMyTreeNode
的指针即可访问您的自定义字段:
Node := TreeView1.Items.Add(nil, '...');
TMyTreeNode(Node).Toto := ...;
Node := TreeView1.Items.AddChild(Node, '...');
TMyTreeNode(Node).Toto := ...;
...
Value := TMyTreeNode(TreeView1.Items.Item[index]).Toto;
答案 1 :(得分:0)
您可以使用TTreeView的OnAddition
事件执行此操作:
procedure TForm1.TreeView1Addition(Sender: TObject; Node: TTreeNode);
begin
Caption := 'Added ' + Node.Text + ', child count: ' +IntToStr(Node.Count);
if Node.Parent <> Nil then
Node.Text := Node.Text + ', child of ' + Node.Parent.Text;
end;
更新从您的评论中可以看出,TTreeView在添加到treenode的属性方面并不是真正想要做的事情。关键是,TTreeView是Windows常用控件之一的完美包装。
如果您使用TVirtualStringTree,您将获得更大的控制权 - 它是此库中的组件之一:https://github.com/Virtual-TreeView /虚拟-树视图,
因为树节点数据完全是用户定义的。
答案 2 :(得分:-2)
这里是:
type
PMyrec = ^TMyrec;
TMyrec = record
toto: double;
end;
...
procedure TForm1.addnodewithdata(Sender: TObject);
var
NewNode : TTreeNode;
Myrec:double;
MyrecPtr: PMyrec;
begin
new(MyrecPtr);
MyrecPtr^.toto:=1000.;
NewNode := treeview1.Items.AddChildObject(Node, 'name',MyrecPtr);
end;
procedure TForm1.readdataofselectenode(Sender: TObject);
var
CNode : TTreeNode;
begin
Cnode:=treeview1.Items[strtoint(edit1.Text)];
if (cnode.Data <> nil) then
showmessage(floattostr(PMyrec(cnode.Data)^.toto));
end;