【问题标题】:Binding an XML node to a Tree view node将 XML 节点绑定到树视图节点
【发布时间】:2012-04-05 00:14:00
【问题描述】:

我想使用 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 节点,此引用会发生什么情况?

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

感谢所有帮助!

【问题讨论】:

    标签: xml delphi interface treeview


    【解决方案1】:

    不要使用@和^操作符,接口已经是引用了

    第一个代码:

    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

    【讨论】:

    • 接口被引用计数。将接口指针存储到TTreeNode 中不会自动增加引用计数。在向/从TTreeNode 添加/删除接口时,我会在接口上手动调用_AddRef()_Release(),或者更好地将接口存储在TInterfaceList 中,然后将列表索引存储在TTreeNode 中实际的接口指针。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 2019-07-10
    • 2010-11-26
    相关资源
    最近更新 更多