我想使用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节点或从树中删除,该引用会发生什么?
还是有其他直接的解决方案吗?
所有帮助表示赞赏!
答案 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