2012-04-04 21 views
2

イムDelphiのカスタムTTreeNode

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

例えば私のカスタムTTreeNodeクラス

をしようと私が作成し、このようなツリービューのノードを追加します。

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のツリービューに世界最大の専門家であることに主張することはできませんが、私の経験では、ツリーノードを自分で作成することはありません。新しいノードを作成するには、TTreeView.ItemsにあるAddXXXメソッドの1つを常に呼び出す必要があります。

+0

10x thats私が必要なもの:) – TreantBG

関連する問題