谁能讲一讲treeview的data属性的用法和ID是怎么回事?越详细越好!! (100分)

  • 主题发起人 chemstar
  • 开始时间
C

chemstar

Unregistered / Unconfirmed
GUEST, unregistred user!
treeview的data属性是用来做什么用的?能不能指示当前节点的位置和其它详细信息?
我将一个部门的人员按层次关系以树的形式显示在treeview中,能不能在毎个节点(即人名)
的data上保存对应人名的年龄?(但是这个年龄不显示在treeview中,而是与人名一起保存在
另外一个数据库中)
 
treeview中的Data字段是保留给用户程序使用的字段
和组件的Tag属性相似,
Data只是一个指针,可能不能保存那么多的内容
我没有试过保存字符串会不会引起内存泄漏,

不过你可以用它来保存数据集的书签,或主键,
用于快速定位数据库记录
 
treeview有data属性吗?你用的是什么控件来的,我也想知道,不过遇到你那中情况时我是
这样的,就是尽量不用它的stateImages属性,利用这个属性来为保存数据方便,如你要它
保存年龄那你就该树的节点:
TreeView1.Selected.StateIndex:=90
这样就可以保存了,我是这样做的,不过你的是什么控件,能给我看看吗?
 
TreeView的每个节点都有一个Data的成员,是个Pointer类型
就是让用户来保存需要的数据的
 
看一下TTreeNode的帮助:

The following code defines a record type of TMyRec and a record pointer type of PMyRec.

type
PMyRec = ^TMyRec;
TMyRec = record
FName: string;
LName: string;
end;

Assuming these types are used, the following code adds a node to TreeView1 as the last sibling of a specified node. A TMyRec record is associated with the added item. The FName and LName fields are obtained from edit boxes Edit1 and Edit2. The Index parameter is obtained from edit box Edit3. The item is added only if the Index is a valid value.

procedure TForm1.Button1Click(Sender: TObject);

var
MyRecPtr: PMyRec;
TreeViewIndex: LongInt;
begin
New(MyRecPtr);
MyRecPtr^.FName := Edit1.Text;
MyRecPtr^.LName := Edit2.Text;
TreeViewIndex := StrToInt(Edit3.Text);
with TreeView1 do
begin
if Items.Count = 0 then
Items.AddObject(nil, 'Item' + IntToStr(TreeViewIndex), MyRecPtr)
else if (TreeViewIndex < Items.Count) and (TreeViewIndex >= 0) then

Items.AddObject(Items[TreeViewIndex], 'Item' + IntToStr(TreeViewIndex), MyRecPtr);
end;
end;

After an item containing a TMyRec record has been added, the following code retrieves the FName and LName values associated with the item and displays the values in a label.

procedure TForm1.Button2Click(Sender: TObject);

begin
Label1.Caption := PMyRec(TreeView1.Selected.Data)^.FName + ' ' +
PMyRec(TreeView1.Selected.Data)^.LName;
end;
 
to LiChaoHui:
怎么用来快速定位数据库记录?能否详细告知?
其实我是想这样的:把每个节点的名称及在treeview中位置另外保存在一个数据库中。
当然这个数据库还要保存很多的其它的信息,如这个人的年龄,姓别等。利用它的data属性
能做到这一点吗?只要能保存这个节点的位置(或ID)也可以呀!只要能指示当前节点在树中
的位置就行。
  最好来段代码,可另送分。
 
Function FindNodeByID(Trv:TTreeView; id:string):TTreeNode;
var i:integer;
begin
result:=nil;
for i:=0 to Trv.Items.Count-1 do
if string(Trv.Items.Data^)=id
then
begin
result := Trv.Items;
exit;
end;
end; //初始化树

 
楼上说得很详细了。
如果要将它指向一个字串,要注意一些问题。
首先要定义一个字串指针,然后NEW出来,给它赋值,再将指针给DATA
var
p: ^String;
...
new(p);
P^:='a test string.';
item.data:=p;
...
为了保证内存泄漏问题,需要在不需要的时候将它删掉。
onitemdelete()
var
p:^string;
begin
...
if item.data<>nil then
begin
p:=item.data;
p^:='';
dispost(p);
item.data:=nil;
end;
...
end;
这样的话基本就很完美了。
 
每个数据集都有书签
譬如: NewNode.Data := Query1.GetBookmark;
就可以把记录的位置保存在TreeView Node 的Data属性中,

当节点发生变化时,根据这个属性也能很快的找到对应的记录
Query1.GotoBookmark(TheNode.Data);

可以利用此属性将节点与记录建立关联
当然如果你的表主键如果是整数或者能够转化为整数
那么也可以利用主键来建立关联
 
如果要根据一个字段的内容来查找树中的节点,
则可以通过遍历TreeView.Items来进行查找,
也可以用文件路径表示法来表示节点在树中的位置,
这样查找起来会有较高的效率
 
3h 所说的方法也不错,我以前用的就是这样的方法,
可以考虑采用,
但是我对于分配内存,并保证必要的时候完全释放它,感到很厌烦,

避免内存泄漏的最好方法是根本就不去申请内存,也无须释放,
同时带来的是性能上的提高,
毕竟有不需分配内存的实现方法
 
to 3h:
改正:
  当treeview新增或删除节点后或者程序退出后再次打开时,原有的节点的data所存的数据会变化吗?
 
LiChaoHui:
这个就看情况了,如果是创建一个指示性的列表,那确实不用另外申请内存,
事实上不是每次都那么幸运有现有的。
比方说,创建一个目录列表?标题就是目录名了,而全路径就只能放在DATA里面。
那就不得不创建这样的内存对象了。

chemstar:
data可以保存一个叫ID的东西???不明白你的意思。
刚刚试了一下,并没有这种属性和方法呀。TTreeNode。
其实ID这个名称在DELPHI是极少使用的,几乎没有。

DATA这种无类型的指针变量它的应用范围非常广泛,通过强制类型转换,
可以将它作为任何有类型的指针指向该类型的对象,比方前面说的字符串指针,
甚至是指向可视组件的指针,比方说一个表,一个可视组件,一个窗体……
它提供给用户一个扩展的可能,因为一个TListItem或者TTreeNode不可能存放太多的资料,
用它就能很大程度地扩展指示的具体内容了。
 
to 3h:
 对不起,我已基本明白了。
  但有几个小问题:将一个数字存入某节点的data后,当treeview新增或删除节点后,
或者程序退出后再次打开时,原来的节点的data里面所存的数据会丢失或变化吗?
 
 另外,我是一个阿菜,给我一段如下的源码吧:将数字10存入某个节点的data里。 
 
这是最后一点疑问,明白后给分。
 
Data是与特定的节点共存的,
节点没了,保存的Data当然也就没了,

每次打开窗口时,需要重新向TreeView中加载数据,

将一个整数10存入某个节点的Data中
TheNode.Data := Pointer(10);
或者
Integer(TheNode.Data) := 10;
 
to LiChaoHui:
 我的意思是:
当treeview新增或删除节点后,或者程序退出后再次打开时,原来的没有删除的节点的
 data里面所存的数据会丢失或变化吗?

你的意思是:data中存的数据在程序退出后就没了?
 
节点中的数据都是保存在内存中的,
如果程序退出了,如果不保存到数据库中或文件中,
那么所有的东西都会没了
 
to LiChaoHui:
  你的意思是:data中存的数据在程序退出后就没了?下次打开程序时节点的data就是空的?
  那么如何得到确定该节点位置的唯一标记符呢?(当然用名称是不行的,因为可能会重复)
 (在线等待)
 
说一下大致的思路吧

在窗口打开时(或创建时),从数据库中查询数据,根据需要
插入到TreeView中,包括设置他的Data属性,

如果要根据记录的主键查找TreeView中的节点,
可以用节点遍历的方法,查找Data和记录主键一致的节点,
可以看我上面的说明
 
多谢各位!
I see!
 
顶部