2012-04-04 4 views
2

Im пытается сделать мой пользовательский TTreeNode ClassDelphi пользовательских 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; 

Я не могу утверждать, что является величайшим экспертом в мире на представлениях Delphi дерева, но в моем опыте вы никогда не создать узел дерева самостоятельно. Вы должны всегда вызывать один из методов AddXXX на TTreeView.Items для создания новых узлов.

+0

10x это то, что мне нужно :) – TreantBG