To symansoft:
1、Noway;
2、在TreeView的OnExpanding事件中可以控制:设置AllowExpansion := False;

解决方案 »

  1.   

    同意Lin的看法,但如果你要在子节点下保存一些数据的话,可以先把数据放到TTreeNode.Data下面去
      

  2.   

    对第一个问题,我是这么做的:
    在Form的OnCreate中创建一个TMemoryStream变量TVSaver(当然在OnDestroy中销毁),当TreeView初始化完全后(即可能Data属性赋了值),这时TreeView是一个全集,调以下语句保存它:
      TreeView.SaveToStream( TVSaver );以后每次在Form的OnShow中执行以下语句恢复TreeView:
      TreeView.LoadFromStream( TVSaver );
    然后裁剪TreeView,使之符合当时的条件。第二个问题,被Lin回答了。
      

  3.   

    对第一个问题,我的看法是:
    人工在程序中控制建立Tree,如建立一个建立树的procedure(),
    在传送参数时明确哪些节点根建立,哪些不要。
      

  4.   

    对于第二个问题可先获得该TREEVIEW当前已选取的TREENODE对象然后判断该节点是否
    可打开如不可则调用TREENODE的Collapsed(False)方法使该节点折叠。
      

  5.   

    我是本问题的提出者symansoft,感谢诸位的解答,但现在还不能给分,因为:
      1.Lin和Firing_Sky没有解答第一个关键问题。分数不会很高。
      2.agui的回答有些眉目,但是现在还用不着LoadFrom和SaveTo等语句。倒是最末一句“然后裁剪TreeView,使之符合当时的条件”令人感兴趣,能详细点吗?
      3.steps的回答过于简略,且题意理解有误。
      本题要求对TreeView节点根据一定条件进行动态控制隐现,比如用鼠标右击某节点,则该节点隐藏起来,以后单击某按钮,则所有被隐藏的节点都全部显示在TreeView中相位置。显然这个过程是动态的。
      

  6.   

    我的意思是你自己创建TTreeNode对象,并把它放到TreeView.item.Data里面,在需要显示的时候再把它挂到所需的TreeNode下面去
      

  7.   

    可以创建一个列表,用于存放不显示的结点。在点右键时如果隐藏结点,则将这个结点
    信息复制一下,并放在列表中,同时记录删除结点的上一结点及层数(用于显示时,加
    到正确地地方)再将treeview上的结点删除。显示时则根据列表中的信息恢复到正确的
    位置。不知行不行。
      

  8.   

      Symansoft再上列位:
      不好意思,我实际上用的是C++Builder4.0,因没有象样的参考书,虽用了几个月,惜未入门。因担心BCB没有Delphi普及,故将问题放在Delphi区请教。
        1。第一个问题似乎可按Firing_Sky的意见,但我还没有试过,只是看了BCB的帮助觉得似乎可行。如果Firing_Sky救人救到底,给个示例就更好了。
        2。也许BCB和Delphi间有些细微区别,我找遍了TTreeView、TTreeNodes和TTreeNode的所有属性,没有发现AllowExpansion属性,所以Lin和Firing_Sky的解决第2个问题的方法似乎行不通,所以再次请教。
        问题彻底解决后,将给出各自应得的分数,包括热心帮助分。
      

  9.   

    AllowExpansion不是一个属性而是在OnExpand事件中的一个变参。