Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как запомнить выбранный узел


Автор: Pavelbej 5.12.2007, 20:05
Здравствуйте!

В VirtualStringTree загружаю папки из выбранной директории. Получается древовидная структура. Так вот, как запомнить выбранный узел, и при следующем старте программы автоматически его выделить. Не могу понять, как это сделать? Куда копать?

Автор: VICTAR 5.12.2007, 22:19
Скорей всего запомнить файл, который выделен. Потом при загрузке найти узел, "отвечающий" за этот файл и выделить. 

Автор: Pavelbej 5.12.2007, 23:26
Цитата(VICTAR @  5.12.2007,  22:19 Найти цитируемый пост)
Скорей всего запомнить файл, который выделен. Потом при загрузке найти узел, "отвечающий" за этот файл и выделить. 


Ну, как один из вариантов, я так и предполагал (ведь при следующем старте, этой папки может уже и не существовать).
Но вот как пройтись по узлам, по их дочерним узлам, и найти этот путь?

Автор: VICTAR 6.12.2007, 00:14
Цитата(Pavelbej @  5.12.2007,  23:26 Найти цитируемый пост)
Но вот как пройтись по узлам, по их дочерним узлам, и найти этот путь? 

обычной рекурсией

Автор: Alexeis 6.12.2007, 00:36
  Деревья красиво сохраняются в виде XML. 

Автор: Pavelbej 6.12.2007, 01:41
Цитата(VICTAR @  6.12.2007,  00:14 Найти цитируемый пост)
обычной рекурсией 


Что-то я совсем запутался. Значит так, беру имя корневой папки - это RootNode, так? Дальше я должен искать дочерний узел с именем который идет после корневой папки (из сохраненного пути). Как только нашел, но путь не совпадает (т.е. длиннее сохраненный), лезем в него и ищем дальше в дочерних. Вроде так?
Если все верно то с логикой все в порядке, а вот с чего начать писать код, ну никак не соображу, или может уже поздно.

Цитата(Alexeis @  6.12.2007,  00:36 Найти цитируемый пост)
Деревья красиво сохраняются в виде XML.  


А зачем лишние маневры, проверки, если есть папки.

Автор: AriX 6.12.2007, 17:13
Pavelbej
Цитата
Если все верно то с логикой все в порядке, а вот с чего начать писать код, ну никак не соображу, или может уже поздно.

Сохранять выделенный нод можно, например, с помощью функции Path у VirtualStringView.

Загружаешь сохраненный путь. Идёшь по нему циклом, поиск по разделителю (/ или \). Найдя имя очередной папки, ищещь ее в children'ах текущего parent-нода. Если найдешь - меняешь parent-нод на найденный; если нет - можно оставить выделенным последний найденный или сделать что-то другое. И так, пока в пути не будет найден разделитель -- т.е. дошли до имени файла. Опять же, ищешь его в текущем parent-ноде.

Автор: Pavelbej 7.12.2007, 11:13
Вот что удалось сделать:

Функция поиска
Код

function TForm1.FindNodeSelect(ANode: PVirtualNode; const APattern: WideString): PVirtualNode;
  var
    NextNode: PVirtualNode;
    PhoneNode: PLinksCollector;
  begin
    Result := nil;
    NextNode := ANode.FirstChild;
    if Assigned(NextNode) then
      repeat
        PhoneNode := VTCateg.GetNodeData(NextNode);
        if Assigned(PhoneNode) then
          if PhoneNode^.Category = APattern then
            begin
              Result := NextNode;
              Exit;
            end;
        Result := FindNodeSelect(NextNode, APattern);
        NextNode := NextNode.NextSibling;
      until  NextNode = nil;
  end;


При создании формы
Код

    if VTCateg.RootNodeCount > 0 then
        begin
          FoundNode := FindNodeSelect(VTCateg.RootNode, {мой текст});
          if Assigned(FoundNode) then
            begin
                VTCateg.Selected[FoundNode] := True;
                VTCateg.FocusedNode:=FoundNode;
                VTCateg.Expanded[FoundNode]:=true;
            end;
        end;


Оказалось что код работает только для дочерних узлов Корнегого узла. То есть дочерние узлы этих дочерних узлов, не находит.
Понимаю что ошибка в функции поиска, но где?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)