2013-11-27 14 views
0

不知道這是可以或不可以檢索IXMLNodes。我正在使用Delphi XE-5。我想 將XML節點存儲在TreeView的Items Data屬性中?存儲和或從TTreeview項目的數據屬性,如果

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),我需要找回正確以及

謝謝

回答

5

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; 
+0

要命的答案!非常感謝你! – JakeSays

相關問題