您的位置:首页 > 其它

TTreeview如何保存自动删除的对象

2008-04-19 10:25 471 查看
近项目要做一项权限的功能,权限是在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方法了。如果大家知道原因的话,可以告诉我。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: