Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема с обходом подузлов в TreeView

32K
10 марта 2009 года
kopernik21187
31 / / 13.07.2008
Добрый день!
Мне нужно по клику на корневом Node'е в TreeView вывести в memo все его дочерние элементы,у которых level больше чем у него

Код:
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;

обработчик работает корректно ко всем корневым узлам кроме последнего....вылетает в строке
 
Код:
CurItem:=CurItem.GetNext;
.
На этот случай как раз и ставлю проверку
 
Код:
if (CurItem.AbsoluteIndex<TreeView1.Items.Count) then

но все равно вылетает ошибка "Access violation at adress":(
Подскажите,пожалуйста,как научить прогу корректно обрабатывать клик по последнему корневому узлу?Прогонял отладчиком-не помогло.
ПС при отладке заметил такую странность: значение выражения CurItem.Level>SelectLevel почему то в false всегда хотя при этом тело цикла выполняется.Что я не так делаю?Подскажите плиз.
303
10 марта 2009 года
makbeth
1.0K / / 25.11.2004
Похоже, оптимизатор начудил. Хотя... честно говоря, несколько странный способ обхода дерева.
Я бы сделал простенькую рекурсию с использованием GetFirstSibling/GetFirstChild/etc.
14
11 марта 2009 года
Phodopus
3.3K / / 19.06.2008
 
Код:
while Assigned(CurItem) and ...
32K
11 марта 2009 года
kopernik21187
31 / / 13.07.2008
вот рабочий вариант
Код:
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;

Благодарю всех кто откликнулся
14
11 марта 2009 года
Phodopus
3.3K / / 19.06.2008
Цитата: kopernik21187
вот рабочий вариант
Благодарю всех кто откликнулся


Этот код ошибочен. Проверка выполняется чересчур поздно

32K
12 марта 2009 года
kopernik21187
31 / / 13.07.2008
Цитата: Phodopus
Этот код ошибочен. Проверка выполняется чересчур поздно


в принципе да....но когда я ставил проверкув while работало криво почему-то...а так работает как надо...честно сказать для меня самого это загадка почему так получается...может правда оптимизатор чудит?

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог