treeview当选中时,想增加一个属性,用来记录一些信息,现在有3种办法:1。treeview的data属性,也就是指针的办法。但这种办法,指针的创建、删除、释放比较麻烦
2。创建一个数组,根据treeview的TreeView1.Selected.AbsoluteIndex,使treeview和数组关联起来,但数组的大小不好确定,而且在treeview删除、修改后,需要重新关联数组和treeview,当数据较多时,速度会很慢。
3。修改ComCtrls.pas源码,在prvaite和public里写入要增加的字段,但这种办法我在delphi7下试了没成功 :(大家会选择哪种办法呢?
解决方案 »
- 我选择了2009-01月份,我想知道怎样代码或函数写可以成2009-02
- 如何用wordapplication 控件方式 打开word 文档??
- 如何用SMTP发送中文邮件?
- 在WebSnap技术中,我创建了一个模板.html文件并在留了两个密码输入框的位置,我该如何套入我的WebSnap程序呢?
- 關於模糊查詢.請各位幫忙!
- delphi 安装程序如何将SQL Server和后台数据库打包发行?(分不够可以再开帖给分)
- delphi+asp如何实现网络认证
- 哥们,帮帮忙!(如何获取密码)
- 自已做软件项目终于得到了一笔收入,散分。。
- 数据库启动问题
- 如何在excel的面板中增加快捷按钮,点击此按扭后,对当前打开的excel文件进行处理?
- 图片显示问题
TTreeView 有一个事件:onCreateNodeClass,在这个事件中写上:NodeClass:=TTreeNodeEx然后访问节点的时候强制转化一下。
(TTreeView.Selected as TTreeNodeEx).???
记得刚刚开始用的时候,还使用过第四种方法
4、建立两个TreeView,一个用来显示的,另外一个用来保存数据的,用来保存数据的那个visible设为false,两个TreeView之间用AbsoluteIndex关联...hehe
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;这是在堆中添加一个结构体的函数,给定结构体,和指定结构的大小,这样就可以将任意大小的结构体保存.最近很忙,没有时间将这些归纳总结成一个完全的例子,实现后一定发布。