在TTreeview Items数据属性中存储和检索IXMLNodes
不确定这是否可行。我使用的是Delphi XE-5。我想 是否在树视图的Items数据属性中存储XML节点在TTreeview Items数据属性中存储和检索IXMLNodes,xml,delphi,Xml,Delphi,不确定这是否可行。我使用的是Delphi XE-5。我想 是否在树视图的Items数据属性中存储XML节点 Node:= tvwItems.Items.AddObject(nil, RootNode.ChildNodes[I].ChildNodes[0].AttributeNodes[1].Text, RootNode.ChildNodes[I]) 这给了我以下的错误 [dcc32错误]LtLiveApplication_Main.pas(88):E2010不兼容 类型:“指针”和“IXMLN
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),我也需要正确地检索它
谢谢
IXMLNode
是一个参考计数接口。您必须键入cast it,才能将其放入数据
属性中,并且还必须在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;
var
XmlNode:IXMLNode:
节点:TTreeNode;
开始
...
XmlNode:=RootNode.ChildNodes[I];
节点:=tvwItems.Items.Add(nil,XmlNode.ChildNodes[0].AttributeNodes[1].Text);
TMyTreeNode(Node).XmlNode:=XmlNode;
...
结束;
程序TMyForm.tvwItemsClick(发送方:ToObject);
变量
节点:TTreeNode;
XmlNode:IXMLNode;
开始
节点:=tvwItems,选中;
如果节点为nil,则
开始
XmlNode:=TMyTreeNode(Node).XmlNode;
...
结束;
结束;
IXMLNode
是一个引用计数接口。您必须键入cast it,才能将其放入数据
属性中,并且还必须在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;
var
XmlNode:IXMLNode:
节点:TTreeNode;
开始
...
XmlNode:=RootNode.ChildNodes[I];
节点:=tvwItems.Items.Add(nil,XmlNode.ChildNodes[0].AttributeNodes[1].Text);
TMyTreeNode(Node).XmlNode:=XmlNode;
...
结束;
程序TMyForm.tvwItemsClick(发送方:ToObject);
变量
节点:TTreeNode;
XmlNode:IXMLNode;
开始
节点:=tvwItems,选中;
如果节点为nil,则
开始
XmlNode:=TMyTreeNode(Node).XmlNode;
...
结束;
结束;
a一些答案!非常感谢你!真是个好答案!非常感谢你!
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;