我写VC+ADO+ACCESS写个东东,ACCESS中会存放比较多的数据记录(几千或几万条),读出来后,用CTreeCtrl显示!他们是根树,还是树叉同自己定义的NoteID和ParentID决定的!我的树的初始化的办法是,先得到NoteiD最大值,然后根据这个值生成一个数姐,用以下代码进行数据库的读取并插入到树中:while(!m_pRecordset->adoEOF)///读取 {
vNoteID = m_pRecordset->GetCollect("NoteID");
vNoteText = m_pRecordset->GetCollect("NoteText");
vParentID = m_pRecordset->GetCollect("ParentID");
vNoteType = m_pRecordset->GetCollect("NoteType");
//父级项句柄是   hSubItem[vParentID.lVal]
hItem= hSubItem[vParentID.lVal];
item=vNoteID.lVal;

hSubItem[item]=m_wndTreeCtrl.InsertItem((LPCTSTR)(_bstr_t)vNoteText,vNoteType.lVal,vNoteType.lVal,hItem);//插入树叉
问题是,hSubItem[ ]这个数组是根据ACCCESS数据库中数据记录最大ID值生成的,如果这个ID值变得非常大,生成的数组也会非常大,这样影响内存的使用和效率!还有,这个“树”在使用中要经常删除和写入记录,这样的话,这个ID值会越来越大,这个ID值是自动编号的。他每次插入的值都会比前一个ID值大。而就算前面的一些记录被删掉很多,这个ID值也不会变小。 
这样用的时间越长,内存使用的效率就会越差。哪位大哥能帮我解决一下!谢谢了!

解决方案 »

  1.   

    几万条吗,肯定没有注册表大。
    假如是一万,10千*100字节=1M,对内存来说,小意思啦。
    对于long型的ID,不必关心它的大小,
    至于删除插入,对于固定大小空间的操作,堆会处理好的,
    如果你确实需要整理,可以定期的做:
    首先计算存储树的所有空间大小,一次动态申请,将树的结点逐一转移,并释放原来的所有结点。
      

  2.   

    老大!是这样的!
    比如:我现在往数据库中存了一万条数据,这时的的数据ID最大值为1,000,在我删除五千条后,再写入五千条,这时的数据还是一万条,但是数据ID最大值就会变成15,000。像这样的操作如果多了的话,不知道这个ID值会变得多大。
    初始化树叉的数组是根据这个ID值生成的,如果这个值变成了几百万或更多时,真不知道该怎么办!
      

  3.   

    How to Minimize Memory Allocations for New TreeView Control 
     (130697) - You can use the new TreeView Common Control to display a hierarchical list of items. This new control is available for Win32-based applications running under Windows NT or Windows 95. Applications typically use this control to display a list of items... http://support.microsoft.com/default.aspx?scid=kb;en-us;130697