18.05.2009, 19:50 | #1 |
Участник
|
Как открыть все AOT на определенном элементе?
Хочется открыть _все_ дерево АОТ, т.е. для корневого элемента, но при этом раскрыть дерево АОТ до определенного элемента.
Просто TreeNode::findNode('\\Classes\MyClass').AOTnewWindow() не подходит, т.к открывает AOT только c MyClass, а мне нужно все АОТ + выделенный MyClass. TreeNode::indNode('\\').AOTnewWindow() открывает все АОТ, но тогда вопрос как на этом окне раскрыть дерево до MyClass и его выбрать/выделить? Как можно сделать? Заренее спасибо. |
|
18.05.2009, 20:45 | #2 |
Участник
|
Кажется, это реализовано в Tabax
|
|
18.05.2009, 22:48 | #3 |
Боец
|
Цитата:
Сообщение от gl00mie
Кажется, это реализовано в Tabax
Такой способ "Open new window" гораздо удобнее, чем стандартный, ведь часто хочется "подняться" вверх, а тут некуда... Более того, такой функционал решит проблему "нового окна" для таких элементов, как MenuItem, TableField и прочих, которые не имеют под собой child'ов. (такие элементы в OpenNewWindow не видны в 4-ке из-за бага отрисовки окон) см. В DAX4.0 SP2 перестал работать метод AOTnewWindow У меня часто возникает желание сделать такой движок, но пока руки не доходят. Идея реализации проста. 1. Открываем parent-элемент в новом окне 2. С помощью WinApi посылаем посылаем новому окну сообщения, симулирующие нажатие клавиш: "стрелка вниз", "стрелка вправо" до тех пор, пока не раскроем дерево до нужного узла, контролируя в статус-баре AOT-путь интересующего нас элемента. (либо - проще, но чуть менее производительно - после каждого "нажатия" стрелок брать LastAOTSelection и сравнивать с интересующим нас элементом). Было бы очень здорово, если бы кто-либо реализовал такой движок. Последний раз редактировалось DSPIC; 18.05.2009 в 22:55. |
|
18.05.2009, 23:44 | #4 |
Участник
|
Цитата:
Сообщение от DSPIC
2. С помощью WinApi посылаем посылаем новому окну сообщения, симулирующие нажатие клавиш: "стрелка вниз", "стрелка вправо" до тех пор, пока не раскроем дерево до нужного узла, контролируя в статус-баре AOT-путь интересующего нас элемента. (либо - проще, но чуть менее производительно - после каждого "нажатия" стрелок брать LastAOTSelection и сравнивать с интересующим нас элементом).
достаточно послать одну кнопку "Gray *" |
|
19.05.2009, 08:21 | #5 |
Боец
|
|
|
19.05.2009, 08:58 | #6 |
Участник
|
Цитата:
Сообщение от gl00mie
Кажется, это реализовано в Tabax
|
|
19.05.2009, 09:04 | #7 |
Участник
|
Еще, наверное, можно докопаться до дерева через winApi, а потом посылать ему всякие винапишные сообщения. Мне что-то подсказывает, что AndyD может ответить более предментно. Предалагаю вызвать его дух.
|
|
19.05.2009, 09:21 | #8 |
Administrator
|
Видимо имелось в виду "Gray +". Кнопка плюса на малой клавиатуре раскрывает дерево, а кнопка минус - его сворачивает (аналог щелкания мышкой)
Тут 2 задачи: 1. Позиционирование на нужном элементе 2. Раскрытие нужного элемента и его родителей. Вторая задача решается посылкой апишного сообщения окну. Причем посылка нажатия клавиши проще посылки кликания мышкой, т.к. не учитывает координаты "куда ткнуть". Но я бы не рекомендовал посылать клавиши - т.к. это может приводить к некоторым глюкам в случае применения буфера не к Аксапте. Кстати, как я понимаю - идея реализации этой задачи возникла в первую очередь из-за того, что .
__________________
Возможно сделать все. Вопрос времени |
|
19.05.2009, 09:25 | #9 |
Участник
|
Tabax может частично регшить эту проблему - он предоставляет кнопку для Add-Ins, еще оттуда можно перейти к паренту контрола.
|
|
19.05.2009, 10:34 | #10 |
Боец
|
Цитата:
Видимо имелось в виду "Gray +". Кнопка плюса на малой клавиатуре раскрывает дерево, а кнопка минус - его сворачивает (аналог щелкания мышкой)
Цитата:
Еще, наверное, можно докопаться до дерева через winApi, а потом посылать ему всякие винапишные сообщения. Мне что-то подсказывает, что AndyD может ответить более предментно. Предалагаю вызвать его дух.
Цитата:
Причем посылка нажатия клавиши проще посылки кликания мышкой, т.к. не учитывает координаты "куда ткнуть". Но я бы не рекомендовал посылать клавиши - т.к. это может приводить к некоторым глюкам в случае применения буфера не к Аксапте.
Цитата:
Tabax может частично регшить эту проблему - он предоставляет кнопку для Add-Ins, еще оттуда можно перейти к паренту контрола.
\Classes\SysTreeNodeApplObjectOpenNewWindow. Правда, в силу аксаптовских недоделок, на некоторых элементах криво работает. Но в основном, применим. |
|
19.05.2009, 10:55 | #11 |
Участник
|
Здесь такой поиск реализовывался для тройки. В четверке что-то похожее, только названия окон сменили.
По поводу клавиатурного буфера - он не нужен. Достаточно сообщения посылать в очередь сообщений окна. На другие контролы влиять не будет. Только в формах и отчетах поиск нужного контрола будет муторно релизовывать - придется прописывать правила формирования наименований для отображения в AOT. И не факт, что в каких-то версиях они не могут отличаться
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: belugin (2). |
19.05.2009, 11:15 | #12 |
Боец
|
Цитата:
По поводу клавиатурного буфера - он не нужен
Цитата:
Только в формах и отчетах поиск нужного контрола будет муторно релизовывать - придется прописывать правила формирования наименований для отображения в AOT. И не факт, что в каких-то версиях они не могут отличаться
Цитата:
Здесь такой поиск реализовывался для тройки...
|
|
19.05.2009, 13:52 | #13 |
Участник
|
Для форм в тройке можно использовать такой код
X++: #winapi #define.VK_DOWN(0x28) #define.VK_RIGHT(0x27) #properties void OpenControlInAOT() { TreeNode treeNode; TreeNode treeNode1; int wndHandle; str name; FormBuildControl contr; FormControl control; FormBuildDesign fbd; container c; int i; int k; str s; Object obj; ; obj = this.selectedControl(); if (!obj || !SysDictClass::isEqualOrSuperclass(classIdget(obj), classNum(FormControl))) return; fbd = this.form().design(); control = fbd.control(obj.id()); while (control) { c += [control.name()]; if (control.containerId()) control = fbd.control(control.containerId()); else break; } treeNode = this.form(); treeNode = treeNode.AOTfindChild("Designs"); treeNode = treeNode.AOTfindChild("Design"); for (i=conlen(c);i>=1;i--) { if (!treeNode) break; treeNode1 = treeNode.AOTfirstChild(); if (treeNode1) { s = treeNode1.AOTgetProperties(); Name = findProperty(S,#PropertyName); while (treeNode1 && Name != conpeek(c, i)) { treeNode1 = treeNode1.AOTnextSibling(); if (treeNode1) { s = treeNode1.AOTgetProperties(); Name = findProperty(S,#PropertyName); } } } treeNode = treeNode1; } if (!treeNode) return; s = treeNode.treeNodePath(); s = strdel(s, strscan(s, "\\Forms\\", 1, strlen(s)), strlen("\\Forms\\")); wndHandle = treeNode::findNode(this.form().treeNodePath()).AOTnewWindow(); wndHandle = winapi::getWindow(wndHandle, #GW_CHILD); while (wndHandle) { name = winapi::getWindowText(wndHandle); if (name == "TreePane") { for (i=1;i<=strlen(s);i++) { if (substr(s, i, 1) == "\\") { winapi::sendMessageEx(wndHandle, #WM_KEYDOWN, #VK_RIGHT, 0); if (i > 1) winapi::sendMessageEx(wndHandle, #WM_KEYDOWN, #VK_DOWN, 0); } else winapi::sendMessageEx(wndHandle, #WM_CHAR, char2num(substr(s, i, 1), 1), 0); } } wndHandle = winapi::getWindow(wndHandle, #GW_HWNDNEXT); } } Можно повесить на какой-либо стандартный таск (к примеру, 295 - "Что это такое") в классе SysSetupFormRun этот метод, тогда можно будет использовать для любой формы
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: kashperuk (4). |
19.05.2009, 18:32 | #14 |
Боец
|
Решил выходных не ждать, чтобы не отпало желание.
Итак, Описание: Класс реализует функциональность открытия элемента AOТ в новом окне. В отличие от стандарта, в новом окне открывается не сам под-элемент (напр. поле таблицы), а весь элемент (вся таблица), затем происходит разворачивание и позиционирование в дереве на интересующий нас под-элемент(поле таблицы). Основные плюсы:
Особенности реализации:
Последний раз редактировалось DSPIC; 19.05.2009 в 18:34. |
|
|
За это сообщение автора поблагодарили: mazzy (5), Maximin (2). |
Теги |
aot, opennewwindow, законченный пример, полезное |
|
Похожие темы | ||||
Тема | Ответов | |||
HRM,склонение ФИО и все все все | 22 | |||
axaptafreak: AOT search within search results | 0 | |||
Вопрос про AOT | 2 | |||
AOT->documentation | 3 | |||
Кое-что нового про AOT | 2 |
|