Win32TreeView.ExpandItem
#1
Отправлено 21 августа 2006 - 14:20
У меня вопрос по объекту Win32TreeView.
Я делаю что-то вроде:
function Test_TreeView()
{
var w1;
w1 = NameMapping.Sys.pJavaW.Window("#32770", "New").Window("SWT_Window0").Window("SysTreeView32");
w1.DblClickItem("|RootItem|FirstLevel|Element");
}
Изначально TreeView выглядит вот так
[+] RootItem
т.е. элементы не развернуты.
запуск функции Test_TreeView() приводит к неудаче -
"The TreeView node 'FS Outbound connector' not found"
Если самостоятельно развернуть все дерево и после свернуть обратно, т.е. вернуть состояние
[+] RootItem
и после этого запустить Test_TreeView() - результат успех. Почему? Что проихошло? Т.е. чтобы кликнуть на ноду сначала необходимо хотябы один раз ее развернуть?
==========================================
Еще один вопрос как развернуть дерево полностью?
method .ExpandItem разворачивает только ноды следующего дочернего уровня, но не всех уровней. Т.е. происходит как бы нажатие назнак "+" Дополнительной клавиатуры. Если же на дополнительно клавиатуре нажать "*" то ветка развернется полностью, однако тут проблема объект TreeView не имеет метода ExpandAll (или что-то в этом духе) и в то же время такой вот вариатн
TreeViewObj.Keys("*") приведет к нажатю "*" на стандартной части клавиатуры т.е. это звездочка на клавише цифры 8 а не та звездочка что сама по себе над цифрой 9 справа.
Как быть ? как развернуть все дерево? Всмысле есть ли ершение помимо написания алгоритма рекурсивного спуска по дереву.
#2
Отправлено 21 августа 2006 - 15:40
[JScript]
function ExpandBranche(TreeViewObj, FullNodePath)
/*
Params:
TreeViewObj - [Object] - TreeView Control.
FullNodePath - [String] - Full path to node
*/
{
var restoredArray = FullNodePath.split("|");
var pathesArray = new Array(restoredArray.length);
pathesArray[0] = "";
for ( i = 1; i < restoredArray.length; i++)
{
pathesArray[i] = pathesArray[i-1]+"|"+restoredArray[i];
TreeViewObj.ExpandItem(pathesArray[i]);
}
}
пример использования:
function test_Expand()
{
TreeViewObj = NameMapping.Sys.pJavaW.Window("#32770", "New").Window("SWT_Window0").Window("SysTreeView32");
FullNodePath = "|root|firstlev|someval";
ExpandBranche(TreeViewObj, FullNodePath);
TreeViewObj.ClickItem(FullNodePath);
}
Однако не очень удобно каждый раз вызывть какую-то функцию которая подготовит TreeView к тому чтобы можно было непосредственно кликнуть на элемент по имени.
Может как-то проще можно сделать?
#3
Отправлено 22 августа 2006 - 09:27
#4
Отправлено 22 августа 2006 - 12:40
Вместо TreeViewObj.Keys("*") надо написать TreeViewObj.Keys("[X106]"). 106 - виртуальный код клавиши "Серая *"
Спасибо, нашел коды в MSDN. TreeViewObj.Keys("[X"+VK_MULTIPLY+"]"); работет :)
Но первый вопрос все еще открыт. Почему необходимо один раз раскрвыть ноду перед кликом на нее и в то же время если после раскрытия ноды ее закрыть то TC все равно сможет на нее кликнуть.
#5
Отправлено 22 августа 2006 - 16:59
Я думаю дело в том, что узлы в вашем дереве создаются динамически при открытии родительских узлов. TestComplete проверяет путь, переданный в него перед совершением действия (двойного клика в данном случае), а так как некоторые объекты не существуют, то он генерирует ошибку.
Дмитрий
#6
Отправлено 22 августа 2006 - 17:47
Здравствуйте, Dart.
Я думаю дело в том, что узлы в вашем дереве создаются динамически при открытии родительских узлов. TestComplete проверяет путь, переданный в него перед совершением действия (двойного клика в данном случае), а так как некоторые объекты не существуют, то он генерирует ошибку.
Это все объясняет, спасибо!
#7
Отправлено 01 марта 2007 - 10:11
Объект дерева: w.SwingObject('JTree', '', 0);
Как можно добраться до его веток?
Заранее всем спасибо!!!
#8
Отправлено 02 марта 2007 - 06:40
Открыть ветки Swing дерева можно используя нативный метод expandRow(<rowIndex>). Вот у меня есть пара примеров работы с деревом Swing, правда на JScript. Может, пригодится.
... SelectJTreeItemByIndex(w.JTree, "0|1|2") SelectJTreeItem(w.JTree, "JTree|sports|football") ... function SelectJTreeItemByIndex(Tree, Path) { var index, current, i, j; var items = Path.split("|"); current = 0; for (i=0; i<items.length; i++) { index = StrToInt(items[i]); for (j=0; j<index; j++) Tree.collapseRow(current++); Tree.expandRow(current++); } Tree.setSelectionRow(--current); } function SelectJTreeItem(Tree, Path) { i = 0; ind = 0; item = Path.split("|"); while (ind < item.length) { try { CurItem = Tree.getPathForRow(i).getLastPathComponent().toString(); } catch(exception) { Log.Warning("The '" + Path + "' path was not found!") return false; } if (item[ind] != CurItem) i++; else { Tree.expandRow(i++); ind++; } } Tree.setSelectionRow(i-1); return true; } function JRightClickSelectedItem(Tree) { Row = Tree.getMinSelectionRow() Rect = Tree.getRowBounds(Row) Sys.MouseDown(VK_RBUTTON, Tree.SLeft + Rect.centerX, Tree.STop + Rect.centerY) Sys.MouseUp(VK_RBUTTON, Tree.SLeft + Rect.centerX, Tree.STop + Rect.centerY) }
Дмитрий
#9
Отправлено 04 апреля 2007 - 11:06
#10
Отправлено 06 апреля 2007 - 11:48
Боюсь, что нет. Для этого как минимум придётся иметь объект типа TreePath, указывающий на данную ноду, а создавать новые Java объекты из TestComplete'а пока нельзя.
Дмитрий
Количество пользователей, читающих эту тему: 0
0 пользователей, 0 гостей, 0 анонимных