我想使用 TTreeView 浏览 XML。为了将 TreeView 节点与具有属性的 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 );
这会导致异常。据我所知,这与我指向的是接口(interface)而不是对象有关。
是否可以引用 XML 的实际对象而不是接口(interface)? 如果在树中插入或删除新的 XML 节点,此引用会发生什么情况?
或者还有其他直接的解决方案吗?
感谢所有帮助!
最佳答案
不要使用@和^运算符,接口(interface)已经是引用了
第一个代码:
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;
只需在网上搜索有关接口(interface)、类以及它们之间的区别的更多信息。好资料:http://blog.synopse.info/post/2012/02/29/Delphi-and-interfaces
关于xml - 将 XML 节点绑定(bind)到 TreeView 节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9788320/