使用TTreeview显示xml的时候,如何让赋值TTreenode 的 data?(100分)

F

foxgang

Unregistered / Unconfirmed
GUEST, unregistred user!
我想用TTreeview显示一个XML文件并进行修改操作,使用D6的XMLdo
M ,
参照前面的问题回答有下面一段程序用于显示,我想同时将DOM的节点赋值给
TTreenode的data属性以便用户操作后能够直接修改DOM里面的值,
编译通过,但是赋值实际上不正确,运行报错,请问应该怎样正确的写data.
procedure TForm1.ActtreeExecute(Sender: TObject);
procedure add(Xnode: IXMLNode ;
Tnode: TTreeNode) ;
Var
i :integer ;
V :TTreeNode ;
begin
if Xnode.NodeType = ntElement then
begin
if Xnode.NodeName='cat'then
begin
V:=TreeView1.Items.AddChild(Tnode,(Xnode.Attributes['id']+' '+Xnode.Attributes['name']));
V.Data:=@Xnode;
end;
for i := 0 to Xnode.ChildNodes.Count-1do
begin
add(Xnode.ChildNodes,V);
end
end;
end;

var j : integer ;
begin
for j:= 0 to XML1.DocumentElement.ChildNodes.Count-1do
begin
add(XML1.DocumentElement.ChildNodes[j], nil);
end;
end;
 
不要直接给接口赋指针,试一试下面的东西(在D6调试通过)。
type
pxnode=^rdIXMLNode;
rdIXMLNode=record
rd1:IXMLNode;
end;

procedure TForm1.acttreeExecute(Sender: TObject);
procedure add(Xnode:IXMLNode ;
Tnode: TTreeNode) ;
Var
i :integer ;
V :TTreeNode ;
ptnd:pxnode;
begin
if Xnode.NodeType = ntElement then
begin
if Xnode.NodeName='FIELD'then
begin
new(ptnd);
V:=TreeView1.Items.AddChild(Tnode,(Xnode.Attributes['attrname']+' '+Xnode.Attributes['fieldtype']));
ptnd^.rd1:=Xnode;V.Data:=ptnd;
end;
for i := 0 to Xnode.ChildNodes.Count-1do
begin
add(Xnode.ChildNodes,V);
end
end;
end;

var j : integer ;
begin
for j:= 0 to XML1.DocumentElement.ChildNodes.Count-1do
begin
add(XML1.DocumentElement.ChildNodes[j], nil);
end;
end;

procedure TForm1.treeview1Change(Sender: TObject;
Node: TTreeNode);
var s:string;
begin
s:=pxnode(node.Data)^.rd1.NodeName;
showmessage(s);
end;
 
问题解决,j_shen2000兄出刀真是快啊,干脆利落。分数先给了。
另外在程序中使用了new(ptnd),我没有发现在那里释放它,因为对指针不很熟,
不知道能否自动释放,所以在同一层的末尾添加了一个ptnd:=nil,
不知道这样是否可行?
 
顶部