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


Автор: XperT 4.2.2010, 21:45
У меня есть 2 дерева  Virtual Treeview. Оба имеют одинаковый тип хранения данных. В разных ситуациях мне нужно работать с нодами этих деревьев, но чтобы считывать данные мне нужно знать к какому дереву принадлежит конкретно взятый нод. Передавать каждый раз в параметорах указатель дерева не очень удобно.

Как можно определить к какому дереву принадлежит конкретный нод?

Автор: kami 4.2.2010, 22:08
Так пойдет?
Код

if vt1.HasAsParent(MyNode, vt1.RootNode) then
  //NodeOwner=vt1
else
  //NodeOwner=vt2.


Upd: не пойдет, глупость сказал.

Автор: XperT 4.2.2010, 22:43
Решил проблему написанием такой функции:
Код

function GetVTV(node:PVirtualNode):TBaseVirtualTree;
var
  ANode: Pointer;
begin   
  ANode := node;
  while PVirtualNode(ANode).Parent<>nil do ANode := PVirtualNode(ANode).Parent;
  result := TBaseVirtualTree(ANode);
end;

Автор: kami 4.2.2010, 23:09
Цитата(XperT @  4.2.2010,  22:43 Найти цитируемый пост)
Решил проблему 

Если честно, я не понимаю, каким образом это может работать.

Цитата(XperT @  4.2.2010,  22:43 Найти цитируемый пост)
 result := TBaseVirtualTree(ANode);

В этом случае Result будет равен BaseVirtualTree.FRoot.
Смотрим, как он инициализируется:
Код

procedure TBaseVirtualTree.InitRootNode(OldSize: Cardinal = 0);
// Reinitializes the root node
......
  if FRoot = nil then
    FRoot := AllocMem(NewSize)

То есть Froot ну никак не указывает на своего владельца TbaseVirtualTree, а является "самостоятельным" указателем на задействованную область памяти. smile 

Автор: XperT 4.2.2010, 23:28
Смотри сюда:
Код

TVirtualNode = packed record
...
Parent,                  // reference to the node's parent (for the root this contains the treeview)

Автор: kami 4.2.2010, 23:41
Ага, понял.

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