近项目要做一项权限的功能,权限是在TTreeview中来展示,但是在Treeview中的子结点经常要存储很多信息。以前我是利用子结点的addObject方法来添加对象,但是这种方法有一个很大的缺点:当需要重新加载权限的时候,自己必须先释放先前分配的对象,这种方法很容易造成内存泄漏。后来我想到能否通过利用继承TTreeNode来保存对象,然后利用它的析构函数来释放对象。经过一阵子的试验,发现这个方法果然方便多了。下面是相应的操作步骤:
1:新建保存权限的类
struct TPrivelege
{
int ID;
String strName;
ss
};
2:继承TTrreNode类
lass MyNode : public TTreeNode
{
public:
void __fastcall CreatePrev(int Id, String strName)
{
temp = new TPrivelege();
temp->ID = Id;
temp->strName = strName;
}
/*
__fastcall MyNode(TTreeNodes* AOwner, int Id, String strName);
{
TTreeNodes::TTreeNodes(AOwner);//这一句有错
temp = new TPrivelege();
temp->ID = Id;
temp->strName = strName;
}
*/
//很遗憾TTreeNodes::TTreeNodes(AOwner)这句报错,说找不到缺省的构造函数,查看源码明明有,不知道为什么
__fastcall virtual ~MyNode()
{
delete temp;
}
TPrivelege* getPrev()
{
return temp;
}
private:
TPrivelege* temp;
};
3: 设置TTreeview类创建的结点类型为我们自定义的类
TreeView1CreateNodeClass(TCustomTreeView *Sender, TTreeNodeClass &NodeClass)
{
NodeClass = __classid(MyNode);
}
4: 创建结点的方法
MyNode* node = dynamic_cast<MyNode*>treeview->Items->Add(NULL, "根结点1");
node-CreatePrev(1, "tlj");
MyNode* node2 = (MyNode*)TreeView1->Items->AddChild(node, "222");
node2->CreateTemp(2, "yxj");
5:获取结点的方法
MyNode* node = dynamic_cast<MyNode*>treeview->Selected;
node->getPrev()->ID;
node->getPrev()->strName;
很遗憾TTreeNodes::TTreeNodes(AOwner)这句报错,说找不到缺省的构造函数,查看源码明明有,不知道为什么。如果TTreeNodes的构造函数能成功调用,那就可以利用MyNode的构造函数来初始对象的数据,而不需要调用CreatePrev方法了。如果大家知道原因的话,可以告诉我。