2011-07-27 11 views
0

2レベルの項目を持つツリービューがあります。私はすべての選択された "サブ"(レベル1)項目のテキストをメモに追加する必要があります。Delphi:ツリービューでの選択のチェック

for i := 0 to pred(TreeView1.Items.count) do 
if (TreeView1.Items.Item[i].Selected) and (TreeView1.Items.Item[i].Level=1) 
    then 
     begin 
      Memo1.Lines.Add(TreeView1.Items.Item[i].Text) 
     end; 

しかし、どのように彼らの親(レベル0)が選択されている場合(選択したかどうか)自分のチェックを行わずに、一度にすべての「サブ」の項目を追加するには?例えば。私はレベル0の3つのアイテムを選択し、その子供はメモに追加されます。

ありがとうございました!

答えて

3

のみ選択した親を持つレベル1のノードを取得:コメントすることにより、

var 
    Node: TTreeNode; 
    Sub: TTreeNode; 
begin 
    Node := TreeView.Items.GetFirstNode; 
    while Node <> nil do 
    begin 
    if Node.Selected then 
    begin 
     Sub := Node.GetFirstChild; 
     while Sub <> nil do 
     begin 
     Memo1.Lines.Add(Sub.Text); 
     Sub := Sub.GetNextSibling; 
     end; 
    end; 
    Node := Node.GetNextSibling; 
    end; 
end; 

を更新:

が選択された親を持つレベル1のノードを取得し、または自分自身を選択されています

var 
    I: Integer; 
begin 
    for I := 0 to TreeView.Items.Count - 1 do 
    with TreeView.Items[I] do 
     if (Level = 1) and (Selected or Parent.Selected) then 
     Memo1.Lines.Add(Text); 
end; 
+0

をどうもありがとうございました!!!! – maxfax

+0

コードを補完できますか?子が選択されている場合は、Sub.Textを追加する必要があります。あなたのコードのように親だけでなく。ありがとう! – maxfax

+0

完璧!どうもありがとう!!! – maxfax

1

親ノードを持つすべての選択されたノードを探しているようです。次のようにそれを行うための最も簡単な方法は次のとおりです。

procedure EnumerateSelectedNonTopLevelItems(TreeView: TTreeView; List: TStrings); 
var 
    Node: TTreeNode; 
begin 
    for Node in TreeView.Items do 
    if Node.Selected and Assigned(Node.Parent) then 
     List.Add(Node.Text); 
end; 

このルーチンは、あなただけのレベル0とレベル1を持っているので、これは結構ですなどのレベル2、3、4であなたのノードを与えるだろう。あなたは本当にトップレベルのノードの直接の子孫であるノードを必要としなかった場合、あなたは、このようにテストを変更することができます。

if Node.Selected and Assigned(Node.Parent) and not Assigned(Node.Parent.Parent) then 
+0

ありがとう!子供が追加されました – maxfax

+0

@maxfax子供が追加されたかったと思っただけです –

+0

おかげさまで助けてくれてありがとう!!! – maxfax