2012-04-04 127 views
2

我試着讓我的自定義TTreeNode類德爾福定製TTreeNode

例如

TCustomTreeNode = class(TTreeNode) 
    private 
    public 
    Comment:string; 
    end; 

和我創建,並在樹視圖這樣添加節點:

var 
    NewCustomTreeNode:TCustomTreeNode; 
begin 
    NewCustomTreeNode:= TCustomTreeNode.Create(TreeView.Items); 
    NewCustomTreeNode.Comment:='blqblq'; 
    TreeView.Items.AddChild(NewCustomTreeNode,'NodeText'); 

當我嘗試訪問自定義創建的樹節點錯誤彈出。比如我這樣做:

TCustomTreeNode(TreeNode).Comment:='asdadssadas'; 

plase幫助

回答

8

與您的代碼的問題是,調用AddChild結果樹視圖中創建一個新的節點。由於您沒有告訴樹視圖來創建子類的節點,因此會創建一個普通的TTreeNode。然後當你試圖將它投射到TCustomTreeNode時,世界就結束了。

您需要使用OnCreateNodeClass方法來確保樹視圖能夠創建新節點。就像這樣:

type 
    TCustomTreeNode = class(TTreeNode) 
    protected 
    procedure Assign(Source: TPersistent); override; 
    public 
    Comment: string; 
    end; 

procedure TCustomTreeNode.Assign(Source: TPersistent); 
begin 
    if Source is TCustomTreeNode then 
    Comment := TCustomTreeNode(Source).Comment; 
    inherited; 
end; 


procedure TForm1.FormCreate(Sender: TObject); 
var 
    NewNode: TCustomTreeNode; 
begin 
    NewNode := TreeView1.Items.Add(nil, 'Node1') as TCustomTreeNode; 
    NewNode.Comment := 'A comment'; 
    NewNode := TreeView1.Items.Add(nil, 'Node2') as TCustomTreeNode; 
    NewNode.Comment := 'Another comment'; 
end; 

procedure TForm1.TreeView1Click(Sender: TObject); 
var 
    Node: TCustomTreeNode; 
begin 
    Node := TreeView1.Selected as TCustomTreeNode; 
    if Assigned(Node) then 
    ShowMessage(Node.Comment); 
end; 

procedure TForm1.TreeView1CreateNodeClass(Sender: TCustomTreeView; var NodeClass: TTreeNodeClass); 
begin 
    NodeClass := TCustomTreeNode; 
end; 

我不能自稱是世界上對德爾福樹視圖最大的專家,但以我的經驗,你永遠不會創建一個樹節點自己。您應該始終調用AddXXX方法TTreeView.Items中的一個創建新節點。

+0

10倍這就是我需要:) – TreantBG 2012-04-04 16:04:44