2012-04-04 7 views
2

Im Versuch, zu meinen benutzerdefinierten TTreeNode KlasseDelphi benutzerdefinierte TTreeNode

zum Beispiel

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

und i erstellen und fügen Sie den Knoten in der Baumansicht wie diese zu machen:

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

und wenn Ich versuche, auf den benutzerdefinierten Baumknoten zuzugreifen Fehler erscheint. Zum Beispiel muss ich wie folgt aus:

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

plase Hilfe

Antwort

8

Das Problem mit Ihrem Code besteht darin, dass der Anruf an AddChild Ergebnisse in der Baumansicht einen neuen Knoten zu schaffen. Und da Sie der Strukturansicht nicht mitgeteilt haben, dass ein Knoten Ihrer Unterklasse erstellt werden soll, wird eine einfache TTreeNode erstellt. Und dann, wenn Sie versuchen, es auf TCustomTreeNode zu werfen, endet die Welt.

Sie müssen die Methode OnCreateNodeClass verwenden, um sicherzustellen, dass die Strukturansicht neue Knoten erstellen kann. Wie folgt aus:

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; 

kann ich nicht behaupten, die größte Experte der Welt zu sein auf Delphi Baumansichten, aber in meiner Erfahrung, die Sie erstellen nie einen Baum selbst Knoten. Sie sollten immer eine der Methoden AddXXX auf TTreeView.Items aufrufen, um neue Knoten zu erstellen.

+0

10x das ist was ich brauchte :) – TreantBG