当前位置:主页>仓库管理软件> 列表

如何返回 TreeView 中的指针~~ 惭愧呀~~~, 找工程项目管理软件

进销存软件版1楼: TreeView1.Items.AddChildObject (ANode,''Exam'',APtr) , 请问如果得到APtr 这个指针呢? 应该调用哪个方法呢?

2楼: 给你段代码不知道能不能帮你
procedure T_TreeView.LoadObject(strFileName: string; MyTree: TTreeView);
var
i: integer;
listLines: TstringList; //储存配置文件中的每一行的内容
nodeParentNode: TTreeNode; //标记父节点
strLineText: string; //配置文件的每一行的文本内容
strGetText: string; //从每一行中得到的指定字符串
ObjSubObj: T_SubObject; //声明处理子功能项目的对象
begin
if FileExists(strFileName) = true then //判断指定文件是否存在
begin
listLines := TStringList.Create; //创建存贮文件行内容的对象
nodeParentNode := nil;
listLines.LoadFromFile(strFileName); //Fills the list with the lines of text in strFileName
for i := 0 to listLines.Count - 1 do
begin
strLineText := listLines.Strings[i];
if Trim(strLineText)='''' then continue;
strGetText := g_GetBeforeString(''='', strLineText);


if UpperCase(strGetText) = ''KEY'' then
begin
nodeParentNode := MyTree.Items.Add(nodeParentNode, g_GetAfterString(''='', strLineText));
end
else
begin
ObjSubObj := T_SubObject.Create;
ObjSubObj.readLine(strLineText);
MyTree.Items.AddChildObject(nodeParentNode, ObjSubObj.FstrSubObjName, ObjSubObj);
listSubList.Add(ObjSubObj.Clone);
end;
end;
end;
listLines.Free;

// subObj.Free;

// // TODO -cMM: T_TreeView.LoadObj default body inserted
end; 如工程项目管理软件

3楼: 简单地说:
var
aNode: TTreeNode; //要读取指针数据的那个节点
tmpDate: APtr; //我假设APter是你定义的指针数据的数据类型
begin
.....
tmpDate :=APtr(aNode.Data);
......
end;

4楼: 你好像搞错了吧,TreeView1.Items.AddChildObject (ANode,''Exam'',APtr)中的这个
APtr是你要加的这个新节点所指点或者说拥有的一个指针是没有返回的,这个函数返回
的是你新建的这个节点。

5楼: to _Murra,:
你好像搞错了吧,TreeView1.Items.AddChildObject (ANode,''Exam'',APtr)中的这个
APtr是你要加的这个新节点所指点或者说拥有的一个指针是没有返回的,这个函数返回
的是你新建的这个节点。

我就是要从ANode 这个节点得到所指向的数据或者对象. Puha 的做法应该是正确的吧.

6楼: " The Ptr parameter specifies the Data property value of the new node."

进销存软件版7楼: 能解释一下么? 实在是不懂.
The Ptr parameter specifies the Data property value of the new node."

8楼: 我需要解释一下:
1. aNode如果不创建它,而是把它指向一个节点,如:
aNode :=Tr.Items.Item[0]
那么,它指向的是Tr.Items.Item[0],这样做只有一点,节省大量过长的代码,以及当更改Tr.Items.Item[0]时只要改一处,比如:改tr为tvDep时,坏处,要记住aNode所指的位置;aNode.data等同于Tr.Items.Item[0].data;

2. 深入TreeViwe内部代码,不难发现,aNode.data存的是数据内存的地址.Delphi的大很多控件都用到这种方法,比如: TComboBox中的Item中有Object属性,而这些Object是存在一个TList对象中的.

3. 大家都知道,Delphi是一种强制性的代码,类安全检查很强,不能把一个类型的值赋给而一个对象,必需要显示地执行转换,所以,对于楼主的问题,也就为什么要有APtr(aNode.Data)代码的原因了.

4. 要深入理解以上内容,可以参考一下内存堆栈的文章,TStrings类源码,TList类的源码.

或许我说的不对,只是个人意见.但这个意见是有助于加深对这个问题的理解的.

9楼: 多谢 Puha 的指点. 本着来者有分的精神发分嘍..