2017-03-27 39 views
-2

Treeview를 채울 때마다 노드에 정보를 추가하고 싶습니다. 예를 들어, ChildNode를 만들 때 해당 자식을 해당 정도와 연결하고자합니다. 어쩌면이 속성 데이터가 만들어졌지만 처리 방법을 모르겠습니다.delphi treeview 모든 노드에 정보 추가

procedure TForm1.TreeView1Addition(Sender: TObject; Node: TTreeNode); 
begin 
    Caption := 'Added ' + Node.Text + ', child count: ' +IntToStr(Node.Count); 
    if Node.Parent <> Nil then 
    Node.Text := Node.Text + ', child of ' + Node.Parent.Text; 

end; 

업데이트 그것은 TTreeView는 정말 당신이 수행 할 수 있습니다 무엇을위한부터 시작하는 바로 이곳 아니라고 의견에서 보인다

+0

그리고 시도해 보셨나요? – Frazz

+1

꽤 모호하고 명확하지 않습니다. 우리는 당신이 사용하고있는 통제조차 모릅니다. VCL 트리 뷰, FMX 트리 뷰, 가상 트리 뷰가 있습니다. 그리고 우리는 당신이 "혈통의 정도와의 연결 고리"로 연결하는 것을 모른다. 질문을 수정하여 명확하게하십시오. [도움말]에서이 기사를 더 자세히 읽으십시오. –

+0

대답이 하나 뿐인 귀하의 의견은 귀하의 질문이 완전하지 않음을 나타냅니다. 'Data' 속성은 가장 쉽고 정확한 방법 일 것입니다.하지만 질문에 빠진 모든 내용을 채우기 전에 질문에 대답 할 생각은 없습니다. 답변을 수락할지 여부를 결정하는 세부 정보입니다. Btw, "친밀감 정도"는 어떤 데이터 유형입니까? –

답변

1

당신은 VCL의 TTreeView 구성 요소를 사용하는 가정하고 있지 FireMonkey의 TTreeView 구성 요소, 또는 다른 제 3 자 트리보기, 이 상황을 처리하는 가장 좋은 방법은 VCL의 TTreeNode 클래스에서 새 클래스를 파생시키고 원하는 값을 유지하기 위해 사용자 정의 필드를 추가 한 다음 TTreeView.OnCreateNodeClass 이벤트를 사용하여,클래스의 인스턴스를 생성 : 액세스 할 수 TMyTreeNode에 그런

type 
    TMyTreeNode = class(TTreeNode) 
    public 
    Toto: Real; 
    end; 

procedure TMyForm.TreeView1CreateNodeClass(Sender: TCustomTreeView; var NodeClass: TTreeNodeClass); 
begin 
    NodeClass := TMyTreeNode; 
end; 

, 당신은 새로운 노드를 추가하거나 기존 노드의 사용자 정의 값을 retreive해야하는 시간이, 당신은 단순히 입력 캐스팅 할 수있는 TTreeNode 포인터를 당신의 맞춤 입력란 :

Node := TreeView1.Items.Add(nil, '...'); 
TMyTreeNode(Node).Toto := ...; 

Node := TreeView1.Items.AddChild(Node, '...'); 
TMyTreeNode(Node).Toto := ...; 

... 

Value := TMyTreeNode(TreeView1.Items.Item[index]).Toto; 
+0

귀하의 솔루션이 최고입니다. 명확히. – bbd

0

이 작업을 수행하기 위해 TTreeView는의 OnAddition 이벤트를 사용할 수 있습니다 treenode의 속성에 추가하는 조건. 요컨대, TTreeView는 Windows의 공용 컨트롤 중 하나를 둘러싼 아주 중요한 래퍼입니다. 대신 TVirtualStringTree를 사용하는 경우

당신은 훨씬 더 제어 할 것 - 그것은이 라이브러리의 구성 요소 중 하나입니다 : 트리 노드의 데이터가 완전히 사용자 정의이기 때문에 https://github.com/Virtual-TreeView /가상 - 트 리뷰,

. 여기

+0

스카 이프 MArtynA. 나는 양식 캡션에 정보를 표시하는 코드를 시도했다. 내가 원하는 것은 노드에 대한 정확한 정보를 알기 위해 노드를 선택할 때입니다. 나는 그것이 무엇인지에 상관없이 '친밀감 정도'에 대해 썼다. 예를 들어 그 시대 일 수 있었다. 이 정보를 node.text에 쓸 수는 있지만 텍스트 속성에 이름 만 쓰는 것을 선호합니다. – bbd

+0

네, 그게 의도 한 것이지만 업데이트가 보입니다. – MartynA

+0

node.text를 노드의 원래 이름으로 유지하고 정보를 추가하지 않으려합니다. – bbd

-2

그것입니다

type 
PMyrec = ^TMyrec; 
TMyrec = record 
toto: double; 
end; 

...

procedure TForm1.addnodewithdata(Sender: TObject); 
    var 
    NewNode : TTreeNode; 
    Myrec:double; 
    MyrecPtr: PMyrec; 
    begin 
     new(MyrecPtr); 
     MyrecPtr^.toto:=1000.; 
     NewNode := treeview1.Items.AddChildObject(Node, 'name',MyrecPtr); 
    end; 

    procedure TForm1.readdataofselectenode(Sender: TObject); 
    var 
    CNode : TTreeNode; 
    begin 
    Cnode:=treeview1.Items[strtoint(edit1.Text)]; 
    if (cnode.Data <> nil) then   
    showmessage(floattostr(PMyrec(cnode.Data)^.toto)); 
    end; 
+1

'TTreeView.OnDeletion' 이벤트를 사용하여 할당 된 MyRec 인스턴스를 해제해야합니다. 그렇지 않으면 누출 될 것입니다. –

+0

실전. 무슨 소리 야? 처분 (MyrecPtr)? – bbd

+0

예,'New()'로 할당 한 것을'Dispose()'해야합니다 :'procedure TForm1.TreeView1Deletion (Sender : TObject; Node : TTreeNode); Dispose 시작 (PMyRec (Node.Data)); Node.Data : = nil; 끝, ' –