xml - 将 XML 节点绑定(bind)到 TreeView 节点

标签 xml delphi interface treeview

我想使用 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/

相关文章:

delphi - 找出 ISAPI dll 的物理路径

python - Zope 接口(interface)的目的?

java - android - 为两个列表包装器创建通用接口(interface)

Java - 将 XML 文件转换为 Docx 文件

xml - 使用 xmlstarlet 替换 XML 中的标记值

delphi - 测试未在接口(interface)部分声明的类

delphi - 有什么方法可以从 LoadPackage 故障中恢复?

java - 处理类之间的对象

java - Apache 消化器 : NoSuchMethodException: no such accesible method

c# - 有没有一种方法可以将 c# 类序列化为 xml 而无需在类上放置属性?