2017-03-27 6 views
-2

に情報を追加します。 例えば、私がChildNodeを作成するときに、その子をそのkinhsipの度合いにリンクしたいとします。 おそらくプロパティデータがこのために作られていますが、私はそれをどのように処理するのか分かりません。デルファイツリービューは、私がツリービューを移入ノード毎回に情報を追加したいすべてのノード

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のTTreeNodeクラスから新しいクラスを派生し、ご希望の値を保持するためにそれにカスタムフィールドを追加し、あなたはをできるようにTTreeView.OnCreateNodeClassイベントを使用することができますすることですがあなたのクラスのインスタンスを作成します。次に

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

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

を、新しいノードを追加したり、既存のノードのカスタム値を盗んする必要がある時には、単にあなたにアクセスするためのTMyTreeNodeから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の共通コントロールの1つを包括するラッパーです。ツリーノードのデータが完全にユーザ定義であるため、https://github.com/Virtual-TreeView /仮想ツリービュー、

: - あなたが代わりにTVirtualStringTreeを使用する場合

あなたがはるかに大きなコントロールを持つことになり、それがこのライブラリ内のコンポーネントの一つです。

+0

Thks MArtynA。あなたのコードを試してみましたが、フォームのキャプションに情報が表示されました。私が好きなのは、彼の正確な情報を知るためにノードを選択するときです。私はそれが何であっても、「親密度」について書きました。それは、例えば時代です。私はこの情報をnode.textに書くことができましたが、私はtextプロパティに名前だけを書きたいと思っています。 – bbd

+0

はい、それは私がそれを意図したものですが、アップデートを参照してください。 – MartynA

+0

私はノードの元の名前としてnode.textを保持し、そこに情報を追加しません。 – bbd

-2

ここにある:

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

...あなたは、FireMonkeyののTTreeViewコンポーネント、または他のいくつかのサードパーティ製のツリービューVCLのTTreeViewコンポーネントを使用して、されていないと仮定すると、

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

Thks。どういう意味ですか ? dispose(MyrecPtr)? – bbd

+0

はい、 'New()'で割り当てたものを 'Dispose()'しなければなりません。例: 'procedure TForm1.TreeView1Deletion(Sender:TObject; Node:TTreeNode); Dispose(PMyRec(Node.Data));を開始します。 Node.Data:= nil;終了; ' –

関連する問題