Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.04.2011, 03:06   #1
JoLan
Delphi XE7
Пользователь
 
Аватар для JoLan
 
Регистрация: 26.07.2010
Сообщений: 74
Вопрос Обход TreeView с записью в массив

Задача: обойти полностью дерево и составить массив.

У меня получилось это:
Код:
StrRec = record
  Position: Array of Integer;
  Caption: String;
end;
...
IntArray = Array of Integer;
...
MaxLevel: Integer;
...
procedure TForm1.UpdateTree(StartNode: TTreeNode; var Levels: IntArray; var NodeList: StrRecArray);
begin
  if StartNode.Level > MaxLevel then MaxLevel := StartNode.Level;
  SetLength(Levels,StartNode.Level);
  Levels[High(Levels)] := 0;
  while StartNode.GetNext <> nil do begin
    inc(Levels[High(Levels)]);
    SetLength(NodeList,Length(NodeList)+1);
    SetLength(NodeList[High(NodeList)].Position,StartNode.Level);
    Move(Levels[0],NodeList[High(NodeList)].Position[0],4*StartNode.Level);
    NodeList[High(NodeList)].Caption := StartNode.Text;
    if StartNode.HasChildren then begin
      UpdateTree(StartNode.getFirstChild, Levels, NodeList);
      StartNode := StartNode.GetNext;
    end;
    StartNode := StartNode.GetNext;
  end;
end;
После выполнения данной процедуры наблюдаю, что в массиве хранится больше элементов, чем на самом деле в TreeView. При дебаге выяснилось, что при рекурсивном вызове в массив заносятся элементы от StartNode и до конца. Как реализовать обход только соседних элементов без дочерних и родительских?

Последний раз редактировалось JoLan; 19.04.2011 в 03:09.
JoLan вне форума Ответить с цитированием
Старый 19.04.2011, 21:55   #2
JoLan
Delphi XE7
Пользователь
 
Аватар для JoLan
 
Регистрация: 26.07.2010
Сообщений: 74
По умолчанию

Чуть подправил, теперь обходит корректно:
Код:
procedure TForm1.UpdateTree(StartNode: TTreeNode; var Levels: IntArray; var NodeList: StrRecArray);
begin
  if StartNode.Level > MaxLevel then MaxLevel := StartNode.Level;
  while StartNode <> nil do begin
    SetLength(NodeList,Length(NodeList)+1);
    SetLength(NodeList[High(NodeList)].Position,StartNode.Level);
    SetLength(Levels,StartNode.Level);
    inc(Levels[High(Levels)]);
    Move(Levels[0],NodeList[High(NodeList)].Position[0],4*StartNode.Level);
    NodeList[High(NodeList)].Caption := '[*]' + StartNode.Text;
    if StartNode.HasChildren then UpdateTree(StartNode.getFirstChild, Levels, NodeList);
    StartNode := StartNode.GetNextChild(StartNode);
  end;
end;
JoLan вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
структуры с записью в файлах hunter08923 Общие вопросы C/C++ 2 13.04.2011 08:36
Проблема с записью на CD pavel42 Компьютерное железо 2 24.09.2009 16:33
помогите с записью! student2009 Помощь студентам 8 03.06.2009 18:36
задача с записью |v||v|<<IpShot Паскаль, Turbo Pascal, PascalABC.NET 11 23.08.2008 17:02