Функция 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.