2014-12-13 2 views
1

Я пытаюсь получить все дочерние узлы выбранного узла в treeview, но столкнулся с несколькими проблемами.Получение выбранных детей с TTreeview

Возьмите этот TreeView в качестве примера:

enter image description here

Я хочу, чтобы получить все узлы, которые ребенок желтого цвета «Папка» узла, который будет дочерние узлы с синей линией рядом с ним ,

Это то, что я пробовал:

procedure Form1.GetTreeChilds(ANode: TTreenode); 
begin 
    while ANode <> nil do 
    begin 
    ListBox1.Items.Add(ANode.Text); 
    ANode := ANode.GetNext; 
    end; 
end; 

Он работает за исключением того, что она также возвращает Пункт 6, который не является дочерним по отношению к желтому цвету «Папке».

Что мне нужно изменить или сделать иначе, чтобы получить дочерние узлы в желтую папку Highligted?

Спасибо.

+0

WAD. Почему вы не используете GetFirstChild и т. Д.? – MartynA

+0

@MartynA Думаю, я упустил это из виду :(Ответ Remy Lebeau - это именно то, что я искал. –

+0

Хорошо. Fwiw, TTreeview + его узлы настолько широко используются, что если его код не работает, это довольно верный признак того, что код не соответствует – MartynA

ответ

4

Попробуйте вместо этого:

procedure Form1.GetTreeChilds(ANode: TTreeNode); 
begin 
    ANode := ANode.GetFirstChild; 
    if ANode = nil then Exit; 
    ListBox1.Items.BeginUpdate; 
    try 
    repeat 
     ListBox1.Items.Add(ANode.Text); 
     GetTreeChilds(ANode); 
     ANode := ANode.GetNextSibling; 
    until ANode = nil; 
    finally 
    ListBox1.Items.EndUpdate; 
    end; 
end; 
+0

Отличное спасибо! Помимо отсутствия GetFirstChild, как указано MartynA, вы использовали Рекурсивную магию, я также не смог попробовать и использовал GetNextSibling. –

+1

Я бы лично избегал блокировки (здесь 'BeginUpdate',' EndUpdate') внутри рекурсивной процедуры. Это трата времени. – TLama

+0

@TLama вы правы, на самом деле у меня только был Listbox.Items.Add для тестирования, Remy, вероятно, расширил его ответ и включил его для дальнейшей помощи, - но я уже знаю о останавливая обновление пользовательского интерфейса с помощью 'BeginUpdate' и' EndUpdate'. –

Смежные вопросы