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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.01.2009, 22:30   #1
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию TreeView - пройтись по всем узлам, начиная с выделенного

Нужно начиная с выделенного узла пройтись по всем его вложенным узлам. Нужно для того чтобы освободить вручную память по указателю хранящемуся в Data узла. Подходящего на форуме невстретилось на этот вопрос. После прохода уже можно будет удалить выделенный узел со всеми под узлами.
Alter вне форума Ответить с цитированием
Старый 11.01.2009, 23:58   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Выделенный - Selected.
Проверяем на HasChildren и сколько их - Count.
Если да, то GetFirstChild, GetNextChild.
Функция должна допускать рекурсивный вызов.
mihali4 вне форума Ответить с цитированием
Старый 12.01.2009, 00:33   #3
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

Я знаю что выделенный это Selected. Но может кто-то уже делал продвижение по всем узлам вручную, с выделенного. Попробую, может получится.
Alter вне форума Ответить с цитированием
Старый 12.01.2009, 15:14   #4
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

Цитата:
Сообщение от mihali4 Посмотреть сообщение
Выделенный - Selected.
Проверяем на HasChildren и сколько их - Count.
Если да, то GetFirstChild, GetNextChild.
Функция должна допускать рекурсивный вызов.
Вот что получилось:
Код:
procedure CtNode(Node :TTreeNode);
var
   I,Cou: integer;
begin
  Delay(1000);               // для
  Node.Text := '-------'; // наглядности процесса
 While Node<>Nil DO
 begin
   Cou := Node.Count;
  If Node.HasChildren and (Cou>0) then
   CtNode(Node.getFirstChild);

   Node := Node.GetNextChild(Node);
  If Node<>Nil then
     CtNode(Node);
 end;
end;
Но работает не совсем как надо(красным), это видно на рисунке:
Alter вне форума Ответить с цитированием
Старый 12.01.2009, 16:22   #5
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Похоже, вы решили перехитрить самого себя
Код:
procedure CtNode(Node :TTreeNode);
var tmpnod: TTreeNode;
begin
while Node.GetFirstChild<>nil do
CtNode(Node.GetFirstChild);
Node.Delete;
Application.ProcessMessages; //для наглядности, когда по шагам :)
end;
mihali4 вне форума Ответить с цитированием
Старый 12.01.2009, 16:52   #6
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

Вот Delay:
Код:
procedure Delay(msecs :Longint);
var
   targettime: Longint;
   Msg: TMsg;
begin 
 targettime := GetTickCount + msecs;
 while targettime>GetTickCount do
 if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
 begin
  If Msg.message = WM_QUIT Then
  begin
   PostQuitMessage(msg.wparam);
   Break;
  end;
   TranslateMessage(Msg);
   DispatchMessage(Msg);
 end;
end;
Спасибо подошло, только если придётся просто пройтись от выделенного узла, то застопорится, т.к неудалит узел.
Alter вне форума Ответить с цитированием
Старый 12.01.2009, 17:08   #7
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

В ваш последний пост номер 6 "не въехал"...

Последний раз редактировалось mihali4; 12.01.2009 в 20:25.
mihali4 вне форума Ответить с цитированием
Старый 12.01.2009, 18:38   #8
Dj_smart
Капсула от спама
Форумчанин
 
Аватар для Dj_smart
 
Регистрация: 04.03.2008
Сообщений: 779
По умолчанию

Поддерживаю. В #4 убейте не вижу рисунка и следовательно того, что должно быть выделено красным
Если данный ответ не столь конкретен, как Вы желаете его увидеть, возможно необходимо поразмыслить, стоит ли вопрос того, чтобы о нём спрашивать на форуме?
CncFiles.ru - бесплатный файловый хостинг
Dj_smart вне форума Ответить с цитированием
Старый 13.01.2009, 21:09   #9
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

Цитата:
Сообщение от Dj_smart Посмотреть сообщение
Поддерживаю. В #4 убейте не вижу рисунка и следовательно того, что должно быть выделено красным
Valar сервер барахлит наверно.
mihali4 это я про то, что если вдруг понадобится просто пробежаться по дереву, начиная с выделеного, дальше первого узла-детёныша не пойдёт.
Alter вне форума Ответить с цитированием
Старый 13.01.2009, 21:17   #10
Dj_smart
Капсула от спама
Форумчанин
 
Аватар для Dj_smart
 
Регистрация: 04.03.2008
Сообщений: 779
По умолчанию

Т.е. я так понял оно захватывает лишний элемент?
Я бы вообще предложил пойти другим путём, узнать есть ли чилдрены у нужного елемента, е если есть, то узнать k:=node.level (уровень) первого чилдрена. Ну и потом while checknode.level>=k do ... т.е проганяем все тогоже уровня, что и первый чилдрен, ну или глубже
Если данный ответ не столь конкретен, как Вы желаете его увидеть, возможно необходимо поразмыслить, стоит ли вопрос того, чтобы о нём спрашивать на форуме?
CncFiles.ru - бесплатный файловый хостинг

Последний раз редактировалось Dj_smart; 13.01.2009 в 21:19.
Dj_smart вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка выделенного текста Aleksandar Общие вопросы Delphi 2 06.10.2008 20:03
Как изменить стиль шрифт выделенного тексту слова в компоненте RichEdit при выделении его? SkAndrew Общие вопросы Delphi 9 23.04.2008 01:35
К существующим узлам TreeView пытаюсь добавить дочерние AlDelta Компоненты Delphi 2 05.11.2007 23:06
защита выделенного текста Александр Microsoft Office Word 5 10.11.2006 07:09