TTreeView使用中经常需要给节点绑定数据,一般有两种方法:
方法一、用指针。定义一个结构体指针绑定到TTreeNode的Data属性上。
比如:
Type
PNodeData=^TNodeData;
TNodeData=Record
ID:Integer;
aName:string;
end;
创建节点时:
var NewNode:TTreeNode;
NodeData:PNodeData;
begin
NewNode:=self.TreeView1.Items.AddChild(nil,'test');
New(NodeData);//分配内存
NodeData^.ID:=100;
NodeData^.aName:='abc';
NewNode.Data:=NodeData;//绑定
//....
end;
使用时,把Node.Data转成指针使用就行了。但是使用指针是必须释放的,TTreeView提供了OnDeletion方法让我们释放,比如:
if Node.Data<>nil then
Dispose(PNodeData(Node.Data));
一般情况下,这样使用没有什么问题,但是如果把TTreeView所在的窗体嵌入别的控件,比如TPanel中,那就会有问题,OnDeletion触发的时机会不对,以前我为这个写过一篇博文:http://hi.baidu.com/0xcea4/blog/item/00fa554bb5d96e2f08f7ef07.html
方法 二、扩展TTreeNode。这个方法需要继承TTreeNode,加上自己需要的成员
比如:
Type
TmyNode=Class(TTreeNode)
public
ID:Integer;
aName:string;
end;
接着,需要在它的OnCreateNodeClass事件返回我们定义的新类,比如:
procedure TForm3.TreeView1CreateNodeClass(Sender: TCustomTreeView;
var NodeClass: TTreeNodeClass);
begin
NodeClass:=TmyNode;
end;
创建节点时:
var NewNode:TmyNode;
begin
NewNode:=self.TreeView1.Items.AddChild(nil,'test') as TmyNode;//注意这里
NewNode.ID:=100;
NewNodeaName:='abc';
//....
end;
使用时也很简单,把Node转换成TmyNode就能访问它的成员了。而且第二种方法还有一个最大的好处就是,不需要自己去释放东西,简单方便。