首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

C++ builder编程久久不能解决的有关问题

2013-03-01 
C++builder编程久久不能解决的问题问题描述:不能显示TTreeView树程序功能:从数据库一个表中读取ParentId,M

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刚好指向下一个元素。你再++,指向就不对了。

热点排行