treeview当选中时,想增加一个属性,用来记录一些信息,现在有3种办法:1。treeview的data属性,也就是指针的办法。但这种办法,指针的创建、删除、释放比较麻烦
2。创建一个数组,根据treeview的TreeView1.Selected.AbsoluteIndex,使treeview和数组关联起来,但数组的大小不好确定,而且在treeview删除、修改后,需要重新关联数组和treeview,当数据较多时,速度会很慢。
3。修改ComCtrls.pas源码,在prvaite和public里写入要增加的字段,但这种办法我在delphi7下试了没成功  :(大家会选择哪种办法呢?

解决方案 »

  1.   

    这个你可以从TTreeNode继承一个类TTreeNodeEx。将需要的属性方到这个类中。
    TTreeView 有一个事件:onCreateNodeClass,在这个事件中写上:NodeClass:=TTreeNodeEx然后访问节点的时候强制转化一下。
    (TTreeView.Selected as TTreeNodeEx).???
      

  2.   

    我现在会选择用指针,data去指向一个数组中的值也是一个不错的方法...
    记得刚刚开始用的时候,还使用过第四种方法
    4、建立两个TreeView,一个用来显示的,另外一个用来保存数据的,用来保存数据的那个visible设为false,两个TreeView之间用AbsoluteIndex关联...hehe
      

  3.   

    用指针涉及创建、删除、释放,稍不留神就会出现错误 :(用数组还有个缺陷,当数组和treeview关联赋值后,在treeview上删除一些节点,此时数组要先全清空,再重新赋值。用类的方法,不用考虑资源释放的问题吗?俺是菜鸟,不会啊
      

  4.   

    1。treeview的data属性,也就是指针的办法。但这种办法,指针的创建、删除、释放比较麻烦
    2。创建一个数组,根据treeview的TreeView1.Selected.AbsoluteIndex,使treeview和数组关联起来,但数组的大小不好确定,而且在treeview删除、修改后,需要重新关联数组和treeview,当数据较多时,速度会很慢。
    3。修改ComCtrls.pas源码,在prvaite和public里写入要增加的字段,但这种办法我在delphi7下试了没成功  :(
    ------------------------------------
    关于TREEVIEW的问题郁闷了我好久,MIS系统中大量用到树,每次实现的方式都不一样,树中的每个节点代表的对象不同,其实是每个节点代表一个对象,对象又分成很多种类.
    用楼主的第一种方式实现后,所有的对象分散在内存中,每个节点在释放时都要将对象释放,反之也是,管理麻烦而且每个不同的树都要写很多类似的代码.
    第二种方式在减少内存碎片上有优势,但是解决不了内存大小的问题.
    改动树的实现方式也是不可取,我也用过,造成在别人的机子上编译时都要重新安装控件.前一段时间看了<<WINDOWS核心编程>>中关于内存分配的部分,关于堆的内存分配方式是解决这的好办法.要在树节点中要保存一些自己的数据,将它定义为record 然后为不同类型的RECORD创建不同的堆,堆只在你真正保存一个记录的时候才分配内存.然后定义一个记录树层次结构的列表,每个节点要用 上一个节点的指针,第一个子节点的指针,下一个节点的指针,上级节点的指针来描述.function TRandomListBuf.Add(const AData; ASize: Integer): hTreeItem;
    var
      NewDataInfo:PDataInfo_Rec;
    begin
      //添加一个数据,重新分配内存
      Result:=HeapAlloc(FhHeap,0,ASize) ;
      if Result=Nil then
        FErrStr :='在堆上分配内存失败。'
      else
      begin
        GetMem (NewDataInfo,Sizeof(TDataInfo_Rec));
        NewDataInfo.ItemID :=Result;
        NewDataInfo.Sizeof :=ASize ;
        FList .Add(NewDataInfo);
        System.Move(AData, Result^, ASize)  ;
      end;
    end;这是在堆中添加一个结构体的函数,给定结构体,和指定结构的大小,这样就可以将任意大小的结构体保存.最近很忙,没有时间将这些归纳总结成一个完全的例子,实现后一定发布。