想在树上挂对象的问题(100分)

  • 主题发起人 主题发起人 zjhjp
  • 开始时间 开始时间
Z

zjhjp

Unregistered / Unconfirmed
GUEST, unregistred user!
有一个树,想将对象挂在上面,以便以后方便使用
...
Users:=TStringList.Create
//全局变量
TmpUser:=TUser.create
//创建一个用户实例
TmpUser.UserID:=fieldbyname('UID').asinteger
//从表中取的值
TmpUser.NickName:=fieldbyname('UserName').asstring;
Users.AddObjects(Inttostr(TmpUser.UserID),TmpUser)
//添加以Users中
Nd^:=TmpUser;
N1 := TreeUser.Items.AddObjectFirst(nil, TmpUser.NickName, Nd)
//挂到树节点上
showMessage(Nd^.NickName)
//此名显示正常
TmpUser.Free;
showMessage(Nd^.NickName)
//此句显示为空

现在我想把创建的对象都保存在全局变量Users中,该如何做?上面的代码编译没有问题,就是没有保存在Users中,因为数据是从表中读取,所以,我采用的是临时创建对象TmpUser,看来这样是不行了,请问各位大富翁,有没有好的办法?
 
码有点乱。给你找了个文章,相信对你有帮助。
delphi中TreeView使用常见问题
编程心得
1,在Delphi中,TreeView控件是一款很出色而且很常用的控件。
在使用过程中,了解到其TTreeNode对象的data属性存储相关数据很有用,一般情况下,我们先声明一个结构体以及其指针,例如:
type
PMyRc = ^TMyRc

TMyRc = Record
id:string

name:string

age:integer

end


添加一个节点,显示信息为TMyRc的name,同时存储id,age。方法如下:
var
p:PMyRc

i:integer

begin
Randomize

for i:= 0 to 9 do
begin
New(p)

p.id:=inttostr(random(100))

p.name:='name'+ inttostr(random(205))

p.age:=random(90)

// Caption := p.id+' '+P.name + ' '+inttostr(p.age)

TreeView1.Items.AddObject(nil,p.name,Tobject(p))

//dispose(p)
如果在这里释放指针,id,age并不能存在树中,而是在这里就被释放了。应该在释放树的事件里书写。
end

end


释放树的事件deletion, 即使是删除也会执行这些代码。所以不用担心内存泄漏。但是如果不书写以下代码,或者用相关的方式释放内存,必定会造成内存泄漏。
procedure TForm1.TreeView1Deletion(Sender: TObject
Node: TTreeNode)

begin
dispose(pmyrc(node.data))

end


访问某个树枝中的age值:
Pmyrc(TreeView1.Selected.data)^.age
 
节点加入 object 或者 record 都是指针而已
不能马上释放内存
要删除节点的时候才能释放内存
 
把这句去掉就OK
TmpUser.Free;
 
谢谢各位大富翁![:)]
 
后退
顶部