在TTreeview Items Data属性中存储和检索IXMLNodes

时间:2013-11-27 19:31:23

标签: xml delphi

不确定这是否可行。我正在使用Delphi XE-5。我想要 将XML节点存储在TreeView的Items Data属性中?

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

这给了我以下错误

  

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

所以,如果不能这样做,也许我可以将子节点的Integer值转换为TObject

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

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

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

谢谢

1 个答案:

答案 0 :(得分:5)

IXMLNode是一个引用计数界面。您必须对其进行类型转换以使其进入Data属性,并且您还必须在TTreeNode处于活动状态时手动递增接口的引用计数,并在{TTreeNode之前递减它1}}被摧毁:

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;