2012-04-04 1 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; 

델파이 트리 뷰에 대한 세계 최고의 전문가가되는 것이 아니라 자신을 노드 트리를 만들 결코 내 경험에 주장 할 수 없습니다. 새 노드를 만들려면 TTreeView.Items에있는 AddXXX 메서드 중 하나를 항상 호출해야합니다.

+0

10x thats 내가 필요한 것 :) – TreantBG