procedure TMainForm.N5Click(Sender: TObject);
var i,SelectLevel: integer;
CaptionStr: string;
NewNode,CurItem:TTreeNode;
begin
SelectLevel:=TreeView1.Selected.Level;
CurItem:=TreeView1.Selected.GetNext;
while (CurItem.Level>SelectLevel) do
begin
memo1.Lines.Add(' Text= '+CurItem.Text+' Level= '+inttostr(CurItem.Level));
if (CurItem.AbsoluteIndex<TreeView1.Items.Count) then
CurItem:=CurItem.GetNext;
end;
end;
Проблема с обходом подузлов в TreeView
Мне нужно по клику на корневом Node'е в TreeView вывести в memo все его дочерние элементы,у которых level больше чем у него
Код:
обработчик работает корректно ко всем корневым узлам кроме последнего....вылетает в строке
Код:
CurItem:=CurItem.GetNext;
На этот случай как раз и ставлю проверку
Код:
if (CurItem.AbsoluteIndex<TreeView1.Items.Count) then
но все равно вылетает ошибка "Access violation at adress":(
Подскажите,пожалуйста,как научить прогу корректно обрабатывать клик по последнему корневому узлу?Прогонял отладчиком-не помогло.
ПС при отладке заметил такую странность: значение выражения CurItem.Level>SelectLevel почему то в false всегда хотя при этом тело цикла выполняется.Что я не так делаю?Подскажите плиз.
Я бы сделал простенькую рекурсию с использованием GetFirstSibling/GetFirstChild/etc.
Код:
while Assigned(CurItem) and ...
Код:
procedure TMainForm.N5Click(Sender: TObject);
var i,SelectLevel: integer;
CaptionStr: string;
NewNode,CurItem:TTreeNode;
begin
SelectLevel:=TreeView1.Selected.Level;
CurItem:=TreeView1.Selected.GetNext;
while (CurItem.Level>SelectLevel) do
begin
memo1.Lines.Add(' Text= '+CurItem.Text+' Level= '+inttostr(CurItem.Level));
if (CurItem<>nil) and (CurItem.AbsoluteIndex<TreeView1.Items.Count-1)
then
CurItem:=CurItem.GetNext else exit;
end;
end;
var i,SelectLevel: integer;
CaptionStr: string;
NewNode,CurItem:TTreeNode;
begin
SelectLevel:=TreeView1.Selected.Level;
CurItem:=TreeView1.Selected.GetNext;
while (CurItem.Level>SelectLevel) do
begin
memo1.Lines.Add(' Text= '+CurItem.Text+' Level= '+inttostr(CurItem.Level));
if (CurItem<>nil) and (CurItem.AbsoluteIndex<TreeView1.Items.Count-1)
then
CurItem:=CurItem.GetNext else exit;
end;
end;
Благодарю всех кто откликнулся
Цитата: kopernik21187
вот рабочий вариант
Благодарю всех кто откликнулся
Благодарю всех кто откликнулся
Этот код ошибочен. Проверка выполняется чересчур поздно
Цитата: Phodopus
Этот код ошибочен. Проверка выполняется чересчур поздно
в принципе да....но когда я ставил проверкув while работало криво почему-то...а так работает как надо...честно сказать для меня самого это загадка почему так получается...может правда оптимизатор чудит?