会的帮帮忙,不会的捧个场!

TTreeNode* __fastcall AddObject(TTreeNode* Node, const AnsiString S, void * Ptr);

Description

The node is added as the last sibling of the node specified by the Node parameter. The S parameter specifies the Text property of the new node. The Ptr parameter specifies the Data property value of the new node. AddObject returns the node that has been added.

Note: The memory referenced by Ptr is not freed when the tree nodes object is freed.

我不明白这三个参数的作用!!!没过四级!
[504 byte] By [ahui2k-小刘飞叉] at [2008-2-16]
# 1
帮助里面有一个Example的,看不懂可以试试,就知道了!
Nomad_man-流浪的人 at 2007-10-22 > top of Msdn China Tech,C++ Builder,基础类...
# 2
不会查字典吗?呵呵
就是在树里面加一个与Node节点同级的一个节点(加在最后),S是节点显示的标题,Ptr是一个指针,用于指定新增节点的Data属性。该函数调用成功返回新增的节点指针
laisf-痛并快乐着 at 2007-10-22 > top of Msdn China Tech,C++ Builder,基础类...
# 3
第一个参数是要添加同级别node的指针,第二个是显示在treeview中的文字,第三个是data属性的指针。这个参数会赋值给data。
cnrealboy-中国男人 at 2007-10-22 > top of Msdn China Tech,C++ Builder,基础类...
# 4
我一步一步问:pItems->AddObject(pItems->Item[TreeViewIndex], "Item" + IntToStr(TreeViewIndex), MyRecPtr);
例子中有上面这条语句,我把第一个参数修改为NULL,可是没什么变化,三个参数中就第二个最好懂,第三个的意思是每个节点的值是PTR指向的类型吗?
原代码如下:
typedef struct MyRec
{
AnsiString FName, LName;

} TMyRec;
typedef TMyRec* PMyRec;

void __fastcall TForm1::Button1Click(TObject *Sender)
{
PMyRec MyRecPtr;
int TreeViewIndex;
TTreeNodes* pItems;

MyRecPtr = new TMyRec;
MyRecPtr->FName = Edit1->Text;
MyRecPtr->LName = Edit2->Text;
TreeViewIndex = StrToInt(Edit3->Text);
pItems = TreeView1->Items;
if (pItems->Count == 0)
pItems->AddObject(NULL, "Item" + IntToStr(TreeViewIndex), MyRecPtr);
else if ((TreeViewIndex < pItems->Count) && (TreeViewIndex >= 0))

pItems->AddObject(pItems->Item[TreeViewIndex], "Item" + IntToStr(TreeViewIndex), MyRecPtr);
}

void __fastcall TForm1::Button2Click(TObject *Sender)
{
Label1->Caption = PMyRec(TreeView1->Selected->Data)->FName + " " +
PMyRec(TreeView1->Selected->Data)->LName;
}

最后这个Button2还他妈报错!!
ahui2k-小刘飞叉 at 2007-10-22 > top of Msdn China Tech,C++ Builder,基础类...
# 5
我来捧场。
myy at 2007-10-22 > top of Msdn China Tech,C++ Builder,基础类...
# 6
第一参数好像不可以为null,
没有变化很正常:反正它是一个指针,系统检查不出来。
第三个参数可以为null,如果你没有特殊要求。
cnrealboy-中国男人 at 2007-10-22 > top of Msdn China Tech,C++ Builder,基础类...
# 7
第一个参数可以为NULL,例子上给的,我也试验了,可是我还是不明白它到底什么作用?
第二个参数不用说了。
第三个我也不明白
ahui2k-小刘飞叉 at 2007-10-22 > top of Msdn China Tech,C++ Builder,基础类...
# 8
你的button2的作用就是利用了data属性,你可以把这个属性看作是一个void*类型的指针
你在添加node的时候,把它的地址赋值给了data属性,在选择的节点上,把该node的data属性指针强制转换回来,成为TMyRec*类型的指针,就可以显示数据了。
cnrealboy-中国男人 at 2007-10-22 > top of Msdn China Tech,C++ Builder,基础类...
# 9

void __fastcall TForm1::Button2Click(TObject *Sender)
{

Label1->Caption = ((TMyRec*)(TreeView1->Selected->Data))->FName + " " +
((TMyRec*)(TreeView1->Selected->Data))->LName;

}

kmfangxun at 2007-10-22 > top of Msdn China Tech,C++ Builder,基础类...
# 10
第一个参数,如果位null那就是在顶层添加结点吧。
第一个参数的作用,就是确定要添加的节点的位置:你要在那个位置添加节点,那就再把这个位置已经存在的一个节点作为参数,然后你添加的节点和他在一个级别,有共同的父节点,但添加的作为小弟弟,排在结尾最下边的地方。

第三个参数在上面已经说得比较清楚了。
cnrealboy-中国男人 at 2007-10-22 > top of Msdn China Tech,C++ Builder,基础类...
# 11
这样添加data好象不对,上次new的TMyRec对象无法释放
应该增加一个TList保存每次new的地址。然后在析构函数里面整体释放
在头文件中增加:TList *NodeList;
在构造函数里:NodeList = new TList();
然后Button1Click函数改为:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
PMyRec MyRecPtr;
int TreeViewIndex;
TTreeNodes* pItems;

MyRecPtr = new TMyRec;
MyRecPtr->FName = Edit1->Text;
MyRecPtr->LName = Edit2->Text;

NodeList->Add(MyRecPtr); //加上这句

TreeViewIndex = StrToInt(Edit3->Text);
pItems = TreeView1->Items;
if (pItems->Count == 0)
pItems->AddObject(NULL, "Item" + IntToStr(TreeViewIndex), MyRecPtr);
else if ((TreeViewIndex < pItems->Count) && (TreeViewIndex >= 0))

pItems->AddObject(pItems->Item[TreeViewIndex], "Item" + IntToStr(TreeViewIndex), MyRecPtr);
}

释放:
for (int i=0; i<NodeList->Count; i++ )
{
PMyRec pNodeItem = ( PMyRec )NodeList->Items[i];
delete pNodeItem;
}
NodeList->Clear();
delete NodeList;
laisf-痛并快乐着 at 2007-10-22 > top of Msdn China Tech,C++ Builder,基础类...
# 12
kmfangxun() 已经把你的那个错误给改正出来了。
其实,你看了那一段话,应该知道改怎么做了。
cnrealboy-中国男人 at 2007-10-22 > top of Msdn China Tech,C++ Builder,基础类...
# 13
laisf(无聊)
这应该是一本书的学习例子吧?是个不负责任的例子,
确实应该在外边按照你说的那样做。

或者建立一个数组,一次性删掉。
cnrealboy-中国男人 at 2007-10-22 > top of Msdn China Tech,C++ Builder,基础类...
# 14
谢谢各位,研究ing..........
这个例子就是cb自带的,还有错误!不可思议!
ahui2k-小刘飞叉 at 2007-10-22 > top of Msdn China Tech,C++ Builder,基础类...
# 15
to kmfangxun() ( )
你那么改还是不对,忘了告诉你这个了:typedef TMyRec* PMyRec;
我看好像还是laisf(无聊) 说的差不多,我一开始就在Button1Click事件里Delete MyRecPtr
了。
另外,各位,如果我想把下面将要加的节点加到第一个节点的子节点怎么写啊
ahui2k-小刘飞叉 at 2007-10-22 > top of Msdn China Tech,C++ Builder,基础类...
# 16
我也来捧场
# 17
trnLocal= trvLocal->Items->AddChild(trnLocal,strTempName);
cnrealboy-中国男人 at 2007-10-22 > top of Msdn China Tech,C++ Builder,基础类...
# 18
AddChild(trnLocal,strTempName);
其中的参数,第一个是要添加子节点的那个节点,第二个是该节点显示的字符串。
返回的是添加的该节点,你可以利用返回值继续设置其它属性和data属性。
cnrealboy-中国男人 at 2007-10-22 > top of Msdn China Tech,C++ Builder,基础类...
# 19
to ahui2k(小刘飞叉)
kmfangxun() 说得对,你删除了那个东西当然不行了,kmfangxun()说的是如何使用data属性,就是那样使用的。
cnrealboy-中国男人 at 2007-10-22 > top of Msdn China Tech,C++ Builder,基础类...
# 20
不,我没删除,它定义在头文件里,即便是这样仍然报错,错误是这样:

access violation at address 00414FB6 in module 'Project1.exe',Read of address 0000000c.
ahui2k-小刘飞叉 at 2007-10-22 > top of Msdn China Tech,C++ Builder,基础类...
# 21
to cnrealboy(中国男人) :

子节点的问题解决了,按你的弄的,一次搞定!!!!
ahui2k-小刘飞叉 at 2007-10-22 > top of Msdn China Tech,C++ Builder,基础类...
# 22
关于第一个参数,我用null和别的它都是从后面一个一个的加,没区别
ahui2k-小刘飞叉 at 2007-10-22 > top of Msdn China Tech,C++ Builder,基础类...
# 23
你没有删除也好,但是data属性的用法就是那样的啊?
你成功访问data的方法难道还有其它的吗?

TMyRec和PMyRec的区别就是一个是结构指针,一个是结构指针而已,出现错误,也不应该是那句代码的原因,而是在他的前面的错误引起的。
cnrealboy-中国男人 at 2007-10-22 > top of Msdn China Tech,C++ Builder,基础类...
# 24

//不好意思,没看到 typedef TMyRec* PMyRec;

void __fastcall TForm1::Button2Click(TObject *Sender)
{

if(TreeView1->SelectionCount==0) //先判断有没有Select Item
return;

Caption = PMyRec(TreeView1->Selected->Data)->FName + " " + //这样可以
PMyRec(TreeView1->Selected->Data)->LName;

// Caption = ((TMyRec*)(TreeView1->Selected->Data))->FName + " " +
// ((TMyRec*)(TreeView1->Selected->Data))->LName;

}
//---------------------------------------------------------------------------
kmfangxun at 2007-10-22 > top of Msdn China Tech,C++ Builder,基础类...
# 25
其实,你们试一下BCB自带的例子,它报错!!data我怎么也取不出来
ahui2k-小刘飞叉 at 2007-10-22 > top of Msdn China Tech,C++ Builder,基础类...
# 26

现在通过没有?

BCB自带的例子在那?我在BCB6上没找到啊?
kmfangxun at 2007-10-22 > top of Msdn China Tech,C++ Builder,基础类...
# 27
你搜索AddObject关键字
ahui2k-小刘飞叉 at 2007-10-22 > top of Msdn China Tech,C++ Builder,基础类...
# 28

不就是你写的代码呀,能通过的,你那有什么问题?
kmfangxun at 2007-10-22 > top of Msdn China Tech,C++ Builder,基础类...
# 29
to kmfangxun()
错误:
access violation at address 00414FB6 in module 'Project1.exe',Read of address 0000000c.
ahui2k-小刘飞叉 at 2007-10-22 > top of Msdn China Tech,C++ Builder,基础类...
# 30
上面不是告诉你了,在Button2Click的函数里要先加一个判断用户是否选了TreeView1的Item
,如果没选应该退出。bcb的列子只是重点讲解如何在TreeView里使用AddObject,有些细节没有加上去,你要自己加。

void __fastcall TForm1::Button2Click(TObject *Sender)
{

if(TreeView1->SelectionCount==0) //先判断用户有没有选择TreeView1的Item
{

Application->MessageBox("兄弟,请先选择TreeView的项目","提示",MB_OK);
return;

}

Label1->Caption = PMyRec(TreeView1->Selected->Data)->FName + " " +
PMyRec(TreeView1->Selected->Data)->LName;

}
//---------------------------------------------------------------------------
kmfangxun at 2007-10-22 > top of Msdn China Tech,C++ Builder,基础类...
# 31
天地良心,谁没选谁小狗!
ahui2k-小刘飞叉 at 2007-10-22 > top of Msdn China Tech,C++ Builder,基础类...