将XML节点绑定到树视图节点

时间:2012-03-20 14:01:19

标签: xml delphi interface treeview

我想使用TTreeView浏览XML。要将树视图节点与具有属性的XML节点相关联,我使用以下语法:

var tv: TTreeView; tn1, tn2: TTreeNode; xn: IXMLNode;

if xn.AttributeNodes.Count > 0 then
  tn2 := tv.Items.AddChildObject( tn1, xn.NodeName, @xn )
else
  tn2 := tv.Items.AddChild( tn1, xn.NodeName );

..后来在该计划中:

var  tv: TTreeView; pxn: ^IXMLNode; i: integer;

pxn := tv.Selected.Data;
for i := 0 to iXML.AttributeNodes.Count-1 do
  ShowMessage ( pxn^.AttributeNodes[i].LocalName + ' = ' +
                pxn^.AttributeNodes[i].Text );

导致异常..据我所知,这与我指向一个接口而不是一个对象这一事实有关。

是否可以引用XML的实际对象而不是接口? 如果在树中插入新的XML节点或从树中删除,该引用会发生什么?

还是有其他直接的解决方案吗?

所有帮助表示赞赏!

1 个答案:

答案 0 :(得分:4)

不要使用@和^运算符,接口已经是引用

第一个代码:

var tv: TTreeView; tn1, tn2: TTreeNode; xn: IXMLNode;

if xn.AttributeNodes.Count > 0 then
  tn2 := tv.Items.AddChildObject( tn1, xn.NodeName, Pointer(xn) )
else
  tn2 := tv.Items.AddChild( tn1, xn.NodeName );

第二个代码(不要忘记检查数据是否已分配)

var  tv: TTreeView; pxn: IXMLNode; i: integer;

if Assigned(tv.Selected) and Assigned(tv.Selected.Data) then begin
  pxn := IXMLNode(tv.Selected.Data);
  for i := 0 to iXML.AttributeNodes.Count-1 do
    ShowMessage ( pxn.AttributeNodes[i].LocalName + ' = ' +
                  pxn.AttributeNodes[i].Text );
end;

只需在网上搜索有关接口,类及其之间差异的更多信息。好消息:http://blog.synopse.info/post/2012/02/29/Delphi-and-interfaces