你好!
  如题.分不够我再加.谢谢~!

解决方案 »

  1.   

    我没有例子,不过感觉应该不难,不过今天没有时间了。你把你的要求写清楚一些,比如,只需要存储tree的字符串吗,如果明天还需要,我可以试试看.
      

  2.   

    需要,我要存储TREE里的内容和关系.比如收藏夹的那种树,我要实现对其的保存和读出,谢谢你呀 我这几天都弄晕了,真的很谢谢你CaptainIII(山上人)
      

  3.   

    对了,尽量请你用对话框模式的APP吧,主要我是要用在对话框程序里的.树的构建完全依赖文件里的数据,麻烦你咯!
      

  4.   

    我觉得我说得还不够详细.主要是要保存树的结构和内容就是说要让程序在读取上次保存的TREE的文件的时候知道各个节点间的关系.究竟是谁是谁的子项.树的结构可以说和IE的收藏夹完全相同.单击就要能展开.恩,我觉得太辛苦你了.我再加100分吧!
      

  5.   

    可以采用xml文件格式。这样存取方便!
      

  6.   

    Tree只有递归
             或
                按层次建表字段
      

  7.   

    数据结构中有讲过树形结构的存贮,建议你看一看数据结构。
    这里我结只结你提供一个思路:
    定义如下的数据结构:
       struct Node
    {
        NODEINFO  nodeInfo;
        int       nParant;
    }
    然后建立一个数组:
        Node TreeStruct[MAX_NODE];
    在nodeInfo中存贮相关的信息,
    在 nParent 中存贮父结点的下标。下标为负值的结点为根结点。
    如何将数组保存起来你应该知道吧。
    读取结点后,根据下标的值,插入相应的结点下就行了。当然存贮树结点的放法有很多,各有优劣,你可以根据需要参考数据结构来确定用哪一种方式。
      

  8.   

    XML的例子我在CODEPORJECT上找到了,可是我这里编译不通过.有人问了作者类似问题,我按照作者建议还是不通过.就放弃了.我的IE可是6.0应该支持XML的DLL没问题的,哎~~数据库啊,我也考虑过,不过可能是我的表设计得还不好读出TREE的时候显示很多问题,有时才显示第一个文件夹就完了
      

  9.   

    恩,看了ukyoking(乐易)的建议我启发很大,哈哈~~是我原来的数据库表没有设计好!我再试试~~~
      

  10.   

    yndfcd(YNDFCD) 我插入相应的节点.如果让程序演示就用定死的就可以了,比如:HTREEITEM hTItem = treeCtrl.AddItem(TVI_ROOT, "Root", NULL, 0,0,0);
    HTREEITEM hTItem1 = treeCtrl.AddItem(TVI_ROOT, "Child1", TVI_LAST, 0,0,0);
    HTREEITEM hTItem2 = treeCtrl.AddItem(hTItem, "Child2", TVI_LAST, 0,0,0);
    HTREEITEM hTItem3 = treeCtrl.AddItem(hTItem1, "Child3", TVI_LAST, 0,0,0);
    可是要在动态的情况下怎么办呢?我用如下方法:
    HTREEITEM hTreeItem[20];
    for(int i=0; i < RecordCount; i++) 
    {
        if( pTreeSet->m_level == 0 ) // 0 表示没有parent
        {
    hTreeItem[pTreeSet->m_ID] = treeCtrl.AddItem(TVI_ROOT, pTreeSet->m_name, NULL, 0,0,0);
        }
        else
       {
    hTreeItem[pTreeSet->m_ID] = treeCtrl.AddItem(hTreeItem[pTreeSet->m_level], pTreeSet->m_name, TVI_LAST, 0,0,0); 
        }
    pTreeSet->MoveNext(); }
    其中m_level记录PARENT的情况,int型的,ID也是int,是每个节点唯一对应的,并且m_level里存放的如果不是0,就是其父节点的ID.可怎么显示时只能显示出第一个节点,而且没有子节点.是怎么会事呢?
      

  11.   

    我用CFile出错,哎.可能哪里没检查到,不过用数据库应该更方便.但是现在就是读出以后在重新AddItem的时候,对于父节点的HTREEITEM值不好弄,因为我的TREE支持拖放,所以变动也许会很大.
      

  12.   

    用数据库不好,因为理论上,可以有无限子项。如果用数据库,定义关系不好搞。你有没有想过直接保存和读取这个TreeCtrl对象?Tree本来就是用链表来保存数据的,你保存这个对象,然后读取这个对象不就好了。你不知道mfc类都是支持这个得?
      

  13.   

    CaptainIII(山上人) :能把例子给我看看嘛,[email protected],你用的什么作的,不会是数据库吧?
      

  14.   

    复合文档,不过好像不能处理重复的item,名称相同时
      

  15.   

    老大,为什么是复合文档呢?我有个例子叫JumpToIt很不错的,是单文档的,结果我用了好久(起码三天)反反复复很多次,都没能把它移植到对话框模式里来.哎~~我没那么菜吧?*&* 郁闷
      

  16.   

    我留言了,山上人.谢谢你哦,数据库也麻烦,最后还有可能在客户机上不能运行,哈哈.还要把那些DLL打包注册.恩~~~还是自己用文件好.
      

  17.   

    CaptainIII(山上人) :我看了,item名称不能相同是因为你使用item的text作为索引来save和load的,如果用itme的HTREEITEM值应该可以的,每个HTREEITEM的值都是不同的。另外,如果叶节点有一个数据结构或者一个文件,这个可以存储嘛?
      

  18.   

    可以,你可以自己看看复合文档的资料,在msdn->Platform SDK->Com and ActiveX Object Services ->Com->Compound Documents
    可以存储任意的数据,把一个复合文档当一个磁盘好了,它有自己建的目录结构
      

  19.   

    建议搂主使用这种复合文档方式存储数据。当然,我喜欢自己用CFile自己写文件,哈哈。这里给出思路,使用一个链表保存所有tree信息,对于有数据的节点,定义一个结构。然后对没一个节点进行保存,分配一定的存储空间,这个结构的第一个DWORD表明这个机构的长度,在load的时候,根据这个长度获得这个结构的数据,保存进入链表,每个结构之间使用一个二进制零隔开(当然别的也行)。load的时候,将所有数据读出来后,一样的可以显示在tree里面。
      

  20.   

    呵呵,我这里有个CMarkup类,很方便的读写XML文件。
    你觉得用xml结构来存储tree结构是不是很方便呢?
    <parent string = "nodename">
    <node>node1</node>
    <node>node2</node>
    </parent>
    反正我这么干了,用一个递归函数,很简单的说。
    至于代码,你到www.codeproject.com上看看,找到MFC -> Tree contol
    部分,那里有好几个现成的例子啦。
      

  21.   

    用递归加复合文档很容易就可以做到,
    复合文档实现了com规范的结构化存储,在文件内部组织了
    一个类似于文件系统的结构,通过IStorage和IStream可以很方便操作符合文档。
      

  22.   

    我都忘记说谢谢了.刚刚太激动嘛!山上人的例子完全符合要求,不过samyoung(sam) 好象觉得用复合文档更好.恩,等我有时间我一定要好好研究一下.我这个项目不能再拖了.哈哈~~恩,感谢大家的帮助,希望我们能成为好朋友!