【问题标题】:Storing and retrieving IXMLNodes in or from a TTreeview Items Data property [duplicate]在 TTreeview Items Data 属性中存储和检索 IXMLNodes [重复]
【发布时间】:2013-11-27 19:31:23
【问题描述】:

不确定这是否可能。我正在使用德尔福 XE-5。我想 在 TreeView 的 Items Data 属性中存储 XML 节点?

Node:= tvwItems.Items.AddObject(nil, RootNode.ChildNodes[I].ChildNodes[0].AttributeNodes[1].Text, RootNode.ChildNodes[I])

这给了我以下错误

[dcc32 错误] LtLiveApplication_Main.pas(88): E2010 不兼容 类型:“指针”和“IXMLNode”

所以,如果这不能完成,也许我可以将子节点的整数值转换为 TObject

Node:= tvwItems.Items.AddObject(nil, RootNode.ChildNodes[I].ChildNodes[0].AttributeNodes[1].Text,TObject(I));

然后在 TreeView OnClick 事件中,我想获取存储的节点,并用它来获取另一个节点

无论如何,一旦我弄清楚我应该如何正确存储它(IXMLNode 或 Integer),我也需要正确检索它

谢谢

【问题讨论】:

    标签: xml delphi


    【解决方案1】:

    IXMLNode 是一个引用计数接口。您必须对其进行类型转换才能将其放入Data 属性中,并且您还必须在TTreeNode 处于活动状态时手动增加接口的引用计数,并在TTreeNode 被销毁之前减少它:

    var
      XmlNode: IXMLNode:
      Node: TTreeNode;
    begin
      ...
      XmlNode := RootNode.ChildNodes[I];
      Node := tvwItems.Items.AddObject(nil, XmlNode.ChildNodes[0].AttributeNodes[1].Text, TCustomData(XmlNode));
      XmlNode._AddRef;
      ...
    end;
    
    procedure TMyForm.tvwItemsDeletion(Sender: TObject; Node: TTreeNode);
    var
      XmlNode: IXMLNode;
    begin
      XmlNode := IXMLNode(Node.Data);
      XmlNode._Release;
    end;
    
    procedure TMyForm.tvwItemsClick(Sender: TObject);
    var
      Node: TTreeNode;
      XmlNode: IXMLNode;
    begin
      Node := tvwItems.Selected;
      if Node <> nil then
      begin
        XmlNode := IXMLNode(Node.Data);
        ...
      end;
    end;
    

    由于需要额外的引用计数,我建议从TTreeNode 派生一个新类并给它一个IXMLNode 成员,这样编译器就可以为您处理引用计数(无需调用_AddRef()_Release() 手动,因此不需要OnDeletion 事件处理程序):

    type
      TMyTreeNode = class(TTreeNode)
      public
        XmlNode: IXMLNode;
      end;
    
    procedure TMyForm.tvwItemsCreateNodeClass(Sender: TCustomTreeView; var NodeClass: TTreeNodeClass);
    begin
      NodeClass := TMyTreeNode;
    end;
    

    var
      XmlNode: IXMLNode:
      Node: TTreeNode;
    begin
      ...
      XmlNode := RootNode.ChildNodes[I];
      Node := tvwItems.Items.Add(nil, XmlNode.ChildNodes[0].AttributeNodes[1].Text);
      TMyTreeNode(Node).XmlNode := XmlNode;
      ...
    end;
    
    procedure TMyForm.tvwItemsClick(Sender: TObject);
    var
      Node: TTreeNode;
      XmlNode: IXMLNode;
    begin
      Node := tvwItems.Selected;
      if Node <> nil then
      begin
        XmlNode := TMyTreeNode(Node).XmlNode;
        ...
      end;
    end;
    

    【讨论】:

    • 真棒答案!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多