Форум: "Основная";
Текущий архив: 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