Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.08.25;
Скачать: [xml.tar.bz2];

Вниз

Дети ноды в дереве   Найти похожие ветки 

 
Nucl   (2003-08-11 15:29) [0]

Как вытащить всех детей и детей детей от текущей ноды,
GetNextChild почему-то возвращает тех, кто на том же уровне, а нужно тех, кто внутри.


 
Skier   (2003-08-11 15:31) [1]

Рекурсия выручит.


 
Nucl   (2003-08-11 15:35) [2]

а правильно чайлда получить как ?


 
Семен Сорокин   (2003-08-11 15:42) [3]

без рекурсии
var
_node: TTreeNode;
_lastnode: TTreeNode;

begin
_node := TreeView1.Selected;
_lastnode := _node.GetNextSibiling;
while _node.GetNextNode <> _lastnode do begin
// все твои ноды

_node := _node.GetNextNode
end
end;


 
Nucl   (2003-08-11 15:53) [4]

Спасибо ! действительно работает, только
Немножко подправленное:
var
_node: TTreeNode;
_lastnode: TTreeNode;

begin
_node := TreeView1.Selected;
_lastnode := _node.GetNextSibiling;
while _node <> _lastnode do begin
// все твои ноды

_node := _node.GetNextNode
end
end;


 
Семен Сорокин   (2003-08-11 15:59) [5]

Nucl © (11.08.03 15:53) [4]
на глаз писал :))


 
Nucl   (2003-08-11 16:05) [6]

однако не все так хорошо:
если в ветке нет другой ноды на том же уровне, GetNextSibiling захватит ноду из другой ветки но на том же уровне соответственно при прогонке высосутся все ноды из другой ветки до уровня текущей ноды :((((


 
Семен Сорокин   (2003-08-11 16:14) [7]

Nucl © (11.08.03 16:05) [6]
Parent"ы проверяй, чё-нить типа этого
var
_node: TTreeNode;
_lastnode: TTreeNode;

begin
_node := TreeView1.Selected;
_lastnode := _node.GetNextSibiling;
if _lastnode.parent <> _node.parent then
_lastnode := _node.parent;
while _node <> _lastnode do begin
// все твои ноды

_node := _node.GetNextNode
end
end;


 
Семен Сорокин   (2003-08-11 16:17) [8]

блин, сорри, все равно неверно


 
Nucl   (2003-08-11 16:18) [9]

Во, как оно лечится и работает:
var
_node: TTreeNode;
_lastnode: TTreeNode;
TempNode2: TTreeNode;
begin
_node := TreeView1.Selected;
_lastnode := _node.GetNextSibiling;
while _node <> _lastnode do begin
// все твои ноды

//во временную ноду
TempNode2 := _node.GetNext;
// если ниже нет нод то будет nil
if TempNode2 = nil then break;
// проверка на перескок на другую ветку
if TempNode2.Parent <> _node then
break
else
_node := _node.GetNextNode;
end
end;


 
Семен Сорокин   (2003-08-11 16:26) [10]

а я наваял через рекурсию:
:))

procedure AllNodesInNode(ANode: TTreeNode);
var
_i : integer;
_node: TTreeNode;
begin
ActionsWithNode(ANode); // твои действия
for _i := 0 to ANode.Count - 1 do begin
_node := ANode.GetNextChild(ANode);
if Assigned(_node) then
AllNodesInNode(_node);
end
end;


 
Nucl   (2003-08-12 09:53) [11]

нда, оба метода работают неверно
в моем не едет на параллельные ветки внутри ноду, а идет только до конца первой, в твоем не заходит вовнуть веток


 
Nucl   (2003-08-12 10:27) [12]

все, нашел решение!
нужно было использовать уровень ноды.

var
_node: TTreeNode;
_lastnode: TTreeNode;
TempNode2: TTreeNode;
RootLevel : integer;
begin
_node := TreeView1.Selected;
RootLevel := _node.Level;_lastnode := _node.GetNextSibiling;
while _node <> _lastnode do begin
// все твои ноды

//во временную ноду
TempNode2 := _node.GetNext;
// если ниже нет нод то будет nil
if TempNode2 = nil then break;
// проверка на перескок на другую ветку
if TempNode2.Level <= RootLevel then
break
else
_node := _node.GetNextNode;
end
end;


 
NAlexey   (2003-08-12 10:34) [13]

Можно так:

procedure TForm1.Button1Click(Sender: TObject);

procedure ProcessChild(Ch: TTreeNode);
var
I: Integer;
begin
with Ch do
for I := 0 to Count - 1 do
begin
{
Действия:
ShowMessage(Items[I].Text);
}
ShowMessage(Item[I].Text);
if Item[I].HasChildren then
ProcessChild(Item[I]);
end;
end;

var
LNode: TTreeNode;
begin
LNode := TreeView1.TopItem;
while LNode <> nil do
begin
{
Действия:
ShowMessage(LNode.Text);
}
if LNode.HasChildren then
ProcessChild(LNode);
LNode := LNode.getNextSibling;
end;
end;



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.08.25;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.01 c
1-81624
Nucl
2003-08-12 23:27
2003.08.25
ComboBox - запретить ввод.


14-81898
race1
2003-08-07 15:39
2003.08.25
ntfs vs. boot floppy


14-81932
passm
2003-08-07 10:30
2003.08.25
Проблемы при ошибочном коннекте GPRS


3-81549
Igorek_c
2003-07-30 13:52
2003.08.25
Count. Qreport


3-81539
ghost_by
2003-07-31 13:54
2003.08.25
Обновление записи в TIBQuaery





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский