100分-->>各位高手,怎么把Tree的结构存入文件又能读出再正确显示呀?在线等待 你好! 如题.分不够我再加.谢谢~! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我没有例子,不过感觉应该不难,不过今天没有时间了。你把你的要求写清楚一些,比如,只需要存储tree的字符串吗,如果明天还需要,我可以试试看. 需要,我要存储TREE里的内容和关系.比如收藏夹的那种树,我要实现对其的保存和读出,谢谢你呀 我这几天都弄晕了,真的很谢谢你CaptainIII(山上人) 对了,尽量请你用对话框模式的APP吧,主要我是要用在对话框程序里的.树的构建完全依赖文件里的数据,麻烦你咯! 我觉得我说得还不够详细.主要是要保存树的结构和内容就是说要让程序在读取上次保存的TREE的文件的时候知道各个节点间的关系.究竟是谁是谁的子项.树的结构可以说和IE的收藏夹完全相同.单击就要能展开.恩,我觉得太辛苦你了.我再加100分吧! 可以采用xml文件格式。这样存取方便! Tree只有递归 或 按层次建表字段 数据结构中有讲过树形结构的存贮,建议你看一看数据结构。这里我结只结你提供一个思路:定义如下的数据结构: struct Node{ NODEINFO nodeInfo; int nParant;}然后建立一个数组: Node TreeStruct[MAX_NODE];在nodeInfo中存贮相关的信息,在 nParent 中存贮父结点的下标。下标为负值的结点为根结点。如何将数组保存起来你应该知道吧。读取结点后,根据下标的值,插入相应的结点下就行了。当然存贮树结点的放法有很多,各有优劣,你可以根据需要参考数据结构来确定用哪一种方式。 XML的例子我在CODEPORJECT上找到了,可是我这里编译不通过.有人问了作者类似问题,我按照作者建议还是不通过.就放弃了.我的IE可是6.0应该支持XML的DLL没问题的,哎~~数据库啊,我也考虑过,不过可能是我的表设计得还不好读出TREE的时候显示很多问题,有时才显示第一个文件夹就完了 恩,看了ukyoking(乐易)的建议我启发很大,哈哈~~是我原来的数据库表没有设计好!我再试试~~~ 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.可怎么显示时只能显示出第一个节点,而且没有子节点.是怎么会事呢? 我用CFile出错,哎.可能哪里没检查到,不过用数据库应该更方便.但是现在就是读出以后在重新AddItem的时候,对于父节点的HTREEITEM值不好弄,因为我的TREE支持拖放,所以变动也许会很大. 用数据库不好,因为理论上,可以有无限子项。如果用数据库,定义关系不好搞。你有没有想过直接保存和读取这个TreeCtrl对象?Tree本来就是用链表来保存数据的,你保存这个对象,然后读取这个对象不就好了。你不知道mfc类都是支持这个得? CaptainIII(山上人) :能把例子给我看看嘛,[email protected],你用的什么作的,不会是数据库吧? 复合文档,不过好像不能处理重复的item,名称相同时 老大,为什么是复合文档呢?我有个例子叫JumpToIt很不错的,是单文档的,结果我用了好久(起码三天)反反复复很多次,都没能把它移植到对话框模式里来.哎~~我没那么菜吧?*&* 郁闷 我留言了,山上人.谢谢你哦,数据库也麻烦,最后还有可能在客户机上不能运行,哈哈.还要把那些DLL打包注册.恩~~~还是自己用文件好. CaptainIII(山上人) :我看了,item名称不能相同是因为你使用item的text作为索引来save和load的,如果用itme的HTREEITEM值应该可以的,每个HTREEITEM的值都是不同的。另外,如果叶节点有一个数据结构或者一个文件,这个可以存储嘛? 可以,你可以自己看看复合文档的资料,在msdn->Platform SDK->Com and ActiveX Object Services ->Com->Compound Documents可以存储任意的数据,把一个复合文档当一个磁盘好了,它有自己建的目录结构 建议搂主使用这种复合文档方式存储数据。当然,我喜欢自己用CFile自己写文件,哈哈。这里给出思路,使用一个链表保存所有tree信息,对于有数据的节点,定义一个结构。然后对没一个节点进行保存,分配一定的存储空间,这个结构的第一个DWORD表明这个机构的长度,在load的时候,根据这个长度获得这个结构的数据,保存进入链表,每个结构之间使用一个二进制零隔开(当然别的也行)。load的时候,将所有数据读出来后,一样的可以显示在tree里面。 呵呵,我这里有个CMarkup类,很方便的读写XML文件。你觉得用xml结构来存储tree结构是不是很方便呢?<parent string = "nodename"><node>node1</node><node>node2</node></parent>反正我这么干了,用一个递归函数,很简单的说。至于代码,你到www.codeproject.com上看看,找到MFC -> Tree contol部分,那里有好几个现成的例子啦。 用递归加复合文档很容易就可以做到,复合文档实现了com规范的结构化存储,在文件内部组织了一个类似于文件系统的结构,通过IStorage和IStream可以很方便操作符合文档。 我都忘记说谢谢了.刚刚太激动嘛!山上人的例子完全符合要求,不过samyoung(sam) 好象觉得用复合文档更好.恩,等我有时间我一定要好好研究一下.我这个项目不能再拖了.哈哈~~恩,感谢大家的帮助,希望我们能成为好朋友! spi 流量监控(不能监控到谷歌浏览器) 遍历注册表的奇怪问题-夜不眠求救命 菜鸟问题 对话框中的控件,为什么只能在事件函数中使用? 如何制作一个类似VB窗体编辑器的东东 請問怎樣使用 CHtmlView::GetHtmlDocument 得到html的源文件 我们可以团结在一起共同进步就不怕MS了。呵呵 ON_NOTIFY()的问题(请高手进) 求助SEND发送数据的问题 在win2000下怎么实现对_outp类似函数的调用 请问怎样把已经加入到VC中的类去掉。 如何使打开文件对话框的左侧出现常用目录的按钮,即我的文档、桌面等
或
按层次建表字段
这里我结只结你提供一个思路:
定义如下的数据结构:
struct Node
{
NODEINFO nodeInfo;
int nParant;
}
然后建立一个数组:
Node TreeStruct[MAX_NODE];
在nodeInfo中存贮相关的信息,
在 nParent 中存贮父结点的下标。下标为负值的结点为根结点。
如何将数组保存起来你应该知道吧。
读取结点后,根据下标的值,插入相应的结点下就行了。当然存贮树结点的放法有很多,各有优劣,你可以根据需要参考数据结构来确定用哪一种方式。
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.可怎么显示时只能显示出第一个节点,而且没有子节点.是怎么会事呢?
可以存储任意的数据,把一个复合文档当一个磁盘好了,它有自己建的目录结构
你觉得用xml结构来存储tree结构是不是很方便呢?
<parent string = "nodename">
<node>node1</node>
<node>node2</node>
</parent>
反正我这么干了,用一个递归函数,很简单的说。
至于代码,你到www.codeproject.com上看看,找到MFC -> Tree contol
部分,那里有好几个现成的例子啦。
复合文档实现了com规范的结构化存储,在文件内部组织了
一个类似于文件系统的结构,通过IStorage和IStream可以很方便操作符合文档。