Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Раскрытие пути к элементу TOutline по его индексу

Когда я писал этот код, у меня была цель по индексу 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 do
  begin
    {Определяем в пути позицию первого '\'}
    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.

Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay