不确定这是否可行。我正在使用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),我还需要正确检索它
谢谢
答案 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;