2011-07-27 57 views
0

有一個樹狀視圖,其中包含兩個級別的項目。我需要將所有選定「子」(1級)項目的文本添加到備忘錄中。德爾福:檢查樹狀視圖中的選擇

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; 

這個程序會給你節點在運行級別2,3,4等等。因爲你只有0級和1級,這是好的。如果你確實需要是頂級節點的直接後裔的節點,那麼你可以修改測試這樣的:

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

謝謝!但它不爲父母:(獨生子女的工作有所幫助相加。 – maxfax

+0

@maxfax我還以爲你只想要孩子補充說。 –

+0

非常感謝! – maxfax