Когда я писал этот код, у меня была цель по индексу TOutlineNode (который
являлся результатом поиска) раскрыть его путь (т.е. раскрыть дочерние узлы,
ведующие к нему), не затрагивая при это остальные узлы.
Следующая процедура в качестве параметра принимает индекс, после чего
раскрывает путь к элементу с этим индексом.
Процедура подразумевает работу с объектом TOutline, имеющим имя Outline.
var
Outline: TOutline;
procedure TSearchDlg.ExpandPathToFoundItem(const FoundItemIndex: Longint);
{----------------------------------------------------------------------------
Открываем путь к данному элементу (элемент определяется номером индекса).
До корневого элемента необходимо раскрывать только родителей.
----------------------------------------------------------------------------}var
ItemIndex: Longint;
Found: Boolean;
LastCh: Longint;
Path: string;
ItemText: string;
SepPos: Integer;
OldSep: string;
begin{Сохраняем старый ItemSpearator}
OldSep := Outline.ItemSeparator;
{Устанавливаем новый ItemSeparator}
Outline.ItemSeparator := '\';
{Получаем полный путь к TOutlineNode и добавляем '\'.
Это делается для упрощения последующего алгоритма}
Path := Outline.Items[FoundItemIndex].FullPath + '\';
{Зацикливаемся до тех пор, пока не будет достигнут конец пути}while Length(Path) > 0 dobegin{Определяем в пути позицию первого '\'}
SepPos := Pos('\', Path);
{Изолируем элемент TOutlineNode}
ItemText := Copy(Path, 1, SepPos - 1);
{Определяем индекс TOutlineNode}
ItemIndex := Outline.GetTextItem(ItemText);
{Раскрываем его}
Outline.Items[ItemIndex].Expand;
{Вырезаем из строки раскрытый TOutlineNode}
Path := Copy(Path, SepPos + 1, Length(Path) - SepPos + 1);
end;
{Восстанавливаем оригинальный ItemSeparator}
Outline.ItemSeparator := OldSep;
end;
Детали
Давайте присвоим элементу желаемый путь:
"My Computer\Hardware\SoundCard\Base Adress"
На первом шаге
возвращается приведенный выше путь. Затем изолируется подстрока "My Computer".
Затем с помощью метода "GetTextItem" определяется индекс TOutlineNode "My
Computer". Метод "Expand" раскрывает это дерево. Впоследствие "My Computer"
вырезается из пути, и новым путем становится "Hardware\SoundCard\Base Adress".
Затем определяется индекс "Hardware", раскрывается, и снова выразается.
Данная процедура повторяется до тех пор, пока не останется пути, который можно
раскрыть. После чего полностью раскрывается путь передаваемой TOutlineNode.
Процедура раскрытия пути к элементу TOutline по его индексу позволяет открыть путь до указанного элемента, не затрагивая другие узлы в outline-дереве.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS