Функция TreeGetNextEx Назад В начало Вперед

Назначение

Перейти на следующий узел (независимо от того, открытый он или закрытый) в treeBrowser. Для обхода дерева используются обработчики событий навигации по дереву cmTreeUp, cmTreeDown и cmTreeTop. Обход дерева происходит в последовательности "сначала вглубь, затем вширь".

Начиная с Атлантис 5.1.32 функция TreeGetNextEx корректно работает совместно с процедурами TreePushPos и TreePopPos. При этом перед первым обращением к TreeGetFirstEx /TreeGetLastEx /TreeGetNextEx /TreeGetPrevEx необходимо выполнить TreePushPos, а после последнего обращения к ним - TreePopPos. В противном случае возможна кривая визуализация дерева, т.к. текущим становится последний обработанный узел, который может оказаться закрытым.

Описание

function TreeGetNextEx (iPanel : longInt) : boolean;

Параметры

iPanel : longInt - имя TreeBrowser в описании интерфейса.

Возвращаемое значение

Если успешно, то true.

Пример

const
  sci178EscExTree_InsLevel = 8212;
end;

Statgal statusLine
{
  (sci178EscExTree_InsLevel..sci178EscExTree_InsLevel)
  {
	'~F1~ Справка', 		 cmHelp, 	kbF1;
	'~F7~ Новая', 		 cmInsert, 	kbF7;
	'~F8~ Удалить', 		 cmDelete, 	kbF8;
	'~Ctrl+F7~ Новая ветка', cmTreeInsLevel,  kbCtrlF7;
	'~Ctrl+Enter~ Открыть',  cmTreeOpenNode,  kbCtrlEnter;
	'~Ctrl+Backspace~ Закрыть', cmTreeCloseNode, kbCtrlBack;
	'', 			 cmHideAll,  kbCtrlGrayMinus;
	'', 			 cmAlt2, 	kbAlt2;
	'', 			 cmAttrib, 	kbCtrlEnter;
	'', 			 cmCompressLevel, kbCtrlBack;
  }
}

interface aExTreePush (,,) escClose;
  show at (,,80,20);
  table struct tblMyTree "Дерево"
  (
	NRec	: comp,
	cOwner  : comp,
	Name	: string[50],
	TipPos  : word
  )
  with index
  (
	tblMyTree01 = NRec (Unique),
	tblMyTree02 = cOwner
  );

  create view
	var
	node: comp;

	as select
	tblMyTree.*
	from
	tblMyTree,
	synonym tblMyTree SubKat,
	synonym tblMyTree tblMyTree2
	where
	((
		node			==  tblMyTree.cOwner
	and tblMyTree.NRec  ==  SubKat.cOwner
	))
  ;

tree tr_tblMyTree ('',,sci178EscExTree_InsLevel);
  show at (,,,);
  table tblMyTree;
  fields
	tblMyTree.Name   'Наименование' : [35], noprotect;
	tblMyTree.TipPos 'Тип' : [5], noprotect;
end;

panel pan_tblMyTree;
  table tblMyTree;

handleEvent
cmTreeTop:
{
  node := 0;
}

cmTreeUp:
{
  node := tblMyTree.cOwner;
}

cmTreeDown:
{
  node := tblMyTree.NRec;
}

cmTreeNodeType:
{
 if (TreeIsTerminal(tr_tblMyTree) or IsNew)
   TreeSetNodeType(tr_tblMyTree, 2);
}

end; // handleEvent
end; // panel

handleEvent
cmInit:
{
  node := 0;

// заполняем таблицу
  ClearBuffer(#tblMyTree2);
  tblMyTree2.NRec := 1;
  tblMyTree2.cOwner := 0;
  tblMyTree2.Name := '1';
  tblMyTree2.TipPos := 10;
  Insert Current tblMyTree2;

  ClearBuffer(#tblMyTree2);
  tblMyTree2.NRec := 2;
  tblMyTree2.cOwner := 1;
  tblMyTree2.Name := '1.1';
  tblMyTree2.TipPos := 20;
  Insert Current tblMyTree2;

  ClearBuffer(#tblMyTree2);
  tblMyTree2.NRec := 3;
  tblMyTree2.cOwner := 2;
  tblMyTree2.Name := '1.1.1';
  tblMyTree2.TipPos := 20;
  Insert Current tblMyTree2;

  ClearBuffer(#tblMyTree2);
  tblMyTree2.NRec := 4;
  tblMyTree2.cOwner := 3;
  tblMyTree2.Name := '1.1.1.1';
  tblMyTree2.TipPos := 20;
  Insert Current tblMyTree2;
}

cmAttrib:
  if (TreeOpenNode(tr_tblMyTree)) then
	RescanPanel(#tblMyTree);

cmCompressLevel:
  if (TreeCloseNode(tr_tblMyTree)) then
	RescanPanel(#tblMyTree);

cmAlt2:
{
// обходим дерево
  var forCounter: boolean;
  TreePushPos(tr_tblMyTree);
  for(forCounter := TreeGetFirstEx(tr_tblMyTree);
	forCounter;
	forCounter := TreeGetNextEx(tr_tblMyTree))
  {
	 // ...тут может быть что нибудь...
  }
  TreePopPos(tr_tblMyTree);
}

end; // handleEvent
end. // interface

Версия

Начиная с Атлантис 5.1.32 добавлена корректная работа совместно с процедурами TreePushPos и TreePopPos.