Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск в VirtualTreeView, как организовать поиск по всему дереву? 
V
    Опции темы
MacTep
Дата 15.8.2012, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: 4
Всего: 4



Осуществляю поиск узла дерева VirtualTreeView следующей процедурой:
Код

// поиск узла дерева
function TfrmTrainingList.FindNode(ANode: PVirtualNode; const APattern: integer): PVirtualNode;
var NextNode: PVirtualNode;
    DataNode: PTrainingNode;
begin
  Result := nil;
  NextNode := ANode.FirstChild;
  if Assigned(NextNode) then
  begin
    repeat
      DataNode := vt.GetNodeData(NextNode);
      if Assigned(DataNode) then
        if DataNode^.training_id = APattern then
        begin
          Result := NextNode;
          exit;
        end;
      // Ищем в дочерних ветках
      Result := FindNode(NextNode, APattern);
      if Result = nil then
        NextNode := NextNode.NextSibling
      else
      begin
        NextNode := nil;
        break;
      end;
    until NextNode = nil;
  end;
end;
Все хорошо работает, если дерево без дочерних элементов, т.е. дерево обычный список.
Если же в дереве есть дочерние элементы, а в них есть еще дочерние элементы, то нужный элемент не находится. Возвращается nil.

Помогите исправить ошибку.



--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
XperT
Дата 15.8.2012, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 269
Регистрация: 19.8.2006

Репутация: 2
Всего: 4



Как то так (не проверял):
Код

function TfrmTrainingList.FindNode(const APattern: integer): PVirtualNode;
var 
    ANode: PVirtualNode;
    DataNode: PTrainingNode;
begin
  Result := nil;
  ANode := vt.GetFirst();
  while ANode <> nil do
  begin
    DataNode := vt.GetNodeData(ANode);
    if (Assigned(DataNode)) and (DataNode^.training_id = APattern) then
    begin
      Result := ANode;
      exit;
    end;

    ANode := vt.GetNext(ANode);
  end;
end;


Это сообщение отредактировал(а) XperT - 15.8.2012, 17:17
PM MAIL   Вверх
kami
Дата 15.8.2012, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Если нодов более чем много, и/или нужно действительно организовать поиск только в дочерних по отношению к заданному нодах, то так:
Код

Result:=nil;
NextNode:=vt.GetNextSibling(ANode); // это следующий нод того же уровня, что и стартовый. Соответственно, поиск должен вестись до него (исключительно)
ANode:=vt.GetFirstChild(ANode);
While Assigned(ANode) and (ANode<>NextNode) do
  begin
    NodeData:=vt.GetNodeData(ANode);
    if ......... then
      begin
        Result:=ANode;
        Break;
      end;
    ANode:=vt.GetNext(ANode);
  end;

PM MAIL WWW   Вверх
MacTep
Дата 15.8.2012, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: 4
Всего: 4



Спасибо! Оба ответа помогли внести ясность в мои мысли по этому вопросу smile


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0689 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.