2012-04-04 128 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