C++ builder编程久久不能解决的问题
问题描述:不能显示TTreeView树
程序功能:从数据库一个表中读取ParentId,MenuId,MenuName动态生成TTreeView树
实现思路:
设计一个map表 map<int,TTreeNode*>存储节点的Id,树节点
结构体 存储父节点ID,子节点Id,节点名称
容器 存储结构体
队列 存储先建立的节点id
首先取得数据后先建立根节点(父节点id为0),并存入map中,并将根节点的id存储到队列中
把其余的节点放到容器中
其次
while(存放节点的容器是否为空)
{
遍历容器;
if(查找容器中节点的父节点id与队列的队首节点id相同)
{
生成这些子节点,并放入mapz中;
将这些子节点的id放入队列中;
从容器中删除这些节点
}
队首元素出队
}
代码如下
vector<MenuTreeInfo>vMenuTreeInfo;
map<int,TTreeNode*>TreeMenu;
queue<int>TopTree;
for(int i = 0;i<qry1->RecordCount;++i)
{
MyMenuTreeInfo.MenuId = qry1->FieldByName("MenuId")->AsInteger;
MyMenuTreeInfo.MenuName = qry1->FieldByName("MenuName")->AsString;
MyMenuTreeInfo.ParentMenuId = qry1->FieldByName("ParentMenuId")->AsInteger;
if(MyMenuTreeInfo.ParentMenuId==0)
{
TTreeNode *tmp = tv1->Items->AddChild(NULL,MyMenuTreeInfo.MenuName);
TreeMenu.insert(map<int,TTreeNode*>::value_type (MyMenuTreeInfo.MenuId,tmp));
TopTree.push(MyMenuTreeInfo.MenuId);
}
else vMenuTreeInfo.push_back(MyMenuTreeInfo);
qry1->Next();
}
while(!vMenuTreeInfo.empty())
{
vector<MenuTreeInfo>::iterator MenuIt;
for(MenuIt = vMenuTreeInfo.begin();MenuIt!=vMenuTreeInfo.end();)
{
if(MenuIt->ParentMenuId==TopTree.front())
{
map<int,TTreeNode*>::iterator mt=TreeMenu.find(MenuIt->ParentMenuId);
if(mt!=TreeMenu.end())
{
TTreeNode *tmp = tv1->Items->AddChild(mt->second,MenuIt->MenuName);
TreeMenu.insert(map<int,TTreeNode*>::value_type(MenuIt->MenuId,tmp));
}
TopTree.push(MenuIt->MenuId);
vMenuTreeInfo.erase(MenuIt++);
}
else MenuIt++;
}
TopTree.pop();
}
[解决办法]
删除操作不会造成内存地址改变,只是数组的改变,删除后iterator刚好指向下一个元素。你再++,指向就不对了。