AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 18.05.2009, 19:50   #1  
Slava Chernenko is offline
Slava Chernenko
Участник
Самостоятельные клиенты AX
Соотечественники
 
34 / 15 (0) ++
Регистрация: 30.04.2008
Адрес: Copenhagen, Denmark
Как открыть все AOT на определенном элементе?
Хочется открыть _все_ дерево АОТ, т.е. для корневого элемента, но при этом раскрыть дерево АОТ до определенного элемента.
Просто TreeNode::findNode('\\Classes\MyClass').AOTnewWindow() не подходит, т.к открывает AOT только c MyClass, а мне нужно все АОТ + выделенный MyClass.

TreeNode::indNode('\\').AOTnewWindow() открывает все АОТ, но тогда вопрос как на этом окне раскрыть дерево до MyClass и его выбрать/выделить?

Как можно сделать?
Заренее спасибо.
Старый 18.05.2009, 20:45   #2  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Кажется, это реализовано в Tabax
Старый 18.05.2009, 22:48   #3  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Кажется, это реализовано в Tabax
Что-то не нахожу. Возможно, проблема не так понята. По всей видимости, автор поста хочет видеть не рис. 1, а рис. 2. Т.е. открывать в новом окне AOT не конктетный подузел, а весь элемент целиком (напр. форму или таблицу), при этом раскрывая дерево до интересующего конкретного подузла, выделив его.
Такой способ "Open new window" гораздо удобнее, чем стандартный, ведь часто хочется "подняться" вверх, а тут некуда... Более того, такой функционал решит проблему "нового окна" для таких элементов, как MenuItem, TableField и прочих, которые не имеют под собой child'ов. (такие элементы в OpenNewWindow не видны в 4-ке из-за бага отрисовки окон) см. В DAX4.0 SP2 перестал работать метод AOTnewWindow

У меня часто возникает желание сделать такой движок, но пока руки не доходят.
Идея реализации проста.
1. Открываем parent-элемент в новом окне
2. С помощью WinApi посылаем посылаем новому окну сообщения, симулирующие нажатие клавиш: "стрелка вниз", "стрелка вправо" до тех пор, пока не раскроем дерево до нужного узла, контролируя в статус-баре AOT-путь интересующего нас элемента. (либо - проще, но чуть менее производительно - после каждого "нажатия" стрелок брать LastAOTSelection и сравнивать с интересующим нас элементом).

Было бы очень здорово, если бы кто-либо реализовал такой движок.
Миниатюры
Нажмите на изображение для увеличения
Название: AOT_New_Window.jpg
Просмотров: 356
Размер:	50.8 Кб
ID:	4708  

Последний раз редактировалось DSPIC; 18.05.2009 в 22:55.
Старый 18.05.2009, 23:44   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от DSPIC Посмотреть сообщение
2. С помощью WinApi посылаем посылаем новому окну сообщения, симулирующие нажатие клавиш: "стрелка вниз", "стрелка вправо" до тех пор, пока не раскроем дерево до нужного узла, контролируя в статус-баре AOT-путь интересующего нас элемента. (либо - проще, но чуть менее производительно - после каждого "нажатия" стрелок брать LastAOTSelection и сравнивать с интересующим нас элементом).
Зачем так сложно?
достаточно послать одну кнопку "Gray *"
__________________
полезное на axForum, github, vk, coub.
Старый 19.05.2009, 08:21   #5  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Цитата:
Сообщение от mazzy Посмотреть сообщение
Зачем так сложно?
достаточно послать одну кнопку "Gray *"
Не понял, - что послать?
Старый 19.05.2009, 08:58   #6  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Кажется, это реализовано в Tabax
Нет, этого нет. Можно только по пути отурыть новое окно. В Sidax - по имени.
Старый 19.05.2009, 09:04   #7  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Еще, наверное, можно докопаться до дерева через winApi, а потом посылать ему всякие винапишные сообщения. Мне что-то подсказывает, что AndyD может ответить более предментно. Предалагаю вызвать его дух.
Старый 19.05.2009, 09:21   #8  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,309 / 3546 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от mazzy Посмотреть сообщение
достаточно послать одну кнопку "Gray *"
Видимо имелось в виду "Gray +". Кнопка плюса на малой клавиатуре раскрывает дерево, а кнопка минус - его сворачивает (аналог щелкания мышкой)

Тут 2 задачи:
1. Позиционирование на нужном элементе
2. Раскрытие нужного элемента и его родителей.

Вторая задача решается посылкой апишного сообщения окну. Причем посылка нажатия клавиши проще посылки кликания мышкой, т.к. не учитывает координаты "куда ткнуть". Но я бы не рекомендовал посылать клавиши - т.к. это может приводить к некоторым глюкам в случае применения буфера не к Аксапте.

Кстати, как я понимаю - идея реализации этой задачи возникла в первую очередь из-за того, что
Цитата:
Сообщение от DSPIC Посмотреть сообщение
решит проблему "нового окна" для таких элементов, как MenuItem, TableField и прочих, которые не имеют под собой child'ов. (такие элементы в OpenNewWindow не видны в 4-ке из-за бага отрисовки окон)
.
__________________
Возможно сделать все. Вопрос времени
Старый 19.05.2009, 09:25   #9  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Tabax может частично регшить эту проблему - он предоставляет кнопку для Add-Ins, еще оттуда можно перейти к паренту контрола.
Старый 19.05.2009, 10:34   #10  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Цитата:
Видимо имелось в виду "Gray +". Кнопка плюса на малой клавиатуре раскрывает дерево, а кнопка минус - его сворачивает (аналог щелкания мышкой)
Не пойдёт. Кроме разворачивать, нужно ещё и вниз двигаться.
Цитата:
Еще, наверное, можно докопаться до дерева через winApi, а потом посылать ему всякие винапишные сообщения. Мне что-то подсказывает, что AndyD может ответить более предментно. Предалагаю вызвать его дух.
Наверное. Именно про это я и сказал + расписал - как именно.
Цитата:
Причем посылка нажатия клавиши проще посылки кликания мышкой, т.к. не учитывает координаты "куда ткнуть". Но я бы не рекомендовал посылать клавиши - т.к. это может приводить к некоторым глюкам в случае применения буфера не к Аксапте.
Да мышка это не вариант. По поводу буфера клавы... хз, нужно пробовать. Можно ввести delay между "нажатиями", дав время на отработку и непереполнение.

Цитата:
Tabax может частично регшить эту проблему - он предоставляет кнопку для Add-Ins, еще оттуда можно перейти к паренту контрола.
эту проблему также решает стандартный класс
\Classes\SysTreeNodeApplObjectOpenNewWindow. Правда, в силу аксаптовских недоделок, на некоторых элементах криво работает. Но в основном, применим.
Старый 19.05.2009, 10:55   #11  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Здесь такой поиск реализовывался для тройки. В четверке что-то похожее, только названия окон сменили.

По поводу клавиатурного буфера - он не нужен. Достаточно сообщения посылать в очередь сообщений окна. На другие контролы влиять не будет.

Только в формах и отчетах поиск нужного контрола будет муторно релизовывать - придется прописывать правила формирования наименований для отображения в AOT. И не факт, что в каких-то версиях они не могут отличаться
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: belugin (2).
Старый 19.05.2009, 11:15   #12  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Цитата:
По поводу клавиатурного буфера - он не нужен
Млин, ну конечно же, причем тут буфер клывы! Сбили с толку

Цитата:
Только в формах и отчетах поиск нужного контрола будет муторно релизовывать - придется прописывать правила формирования наименований для отображения в AOT. И не факт, что в каких-то версиях они не могут отличаться
Так в этом вся соль... Часто открываем в новом окне поля таблицы, или контрол формы.

Цитата:
Здесь такой поиск реализовывался для тройки...
За пример спасибо. Если ни у кого не появилось желание реализовать, постараюсь сам это сделать на выходных. (если получится).
Старый 19.05.2009, 13:52   #13  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Для форм в тройке можно использовать такой код
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);
    }
}
Для формы открывается кусок ее ветки в AOT и позиционируется на выбранном контроле.
Можно повесить на какой-либо стандартный таск (к примеру, 295 - "Что это такое") в классе SysSetupFormRun этот метод, тогда можно будет использовать для любой формы
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: kashperuk (4).
Старый 19.05.2009, 18:32   #14  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Решил выходных не ждать, чтобы не отпало желание.
Итак,

Описание:

Класс реализует функциональность открытия элемента AOТ в новом окне. В отличие от стандарта, в новом окне открывается не сам под-элемент (напр. поле таблицы), а весь элемент (вся таблица), затем происходит разворачивание и позиционирование в дереве на интересующий нас под-элемент(поле таблицы).

Основные плюсы:
Особенности реализации:
  • Не зависит от типа элемента, будь то класс\форма\отчет и прочее
  • Версия для Dax 4.0 (для остальных допишем позже...)
  • Принцип работы описан здесь
Вложения
Тип файла: xpo PrivateProject_DEV_AOTNewWindowDrillDown.xpo (9.1 Кб, 356 просмотров)

Последний раз редактировалось DSPIC; 19.05.2009 в 18:34.
За это сообщение автора поблагодарили: mazzy (5), Maximin (2).
Теги
aot, opennewwindow, законченный пример, полезное

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
HRM,склонение ФИО и все все все OmenSore DAX: Функционал 22 09.02.2009 17:08
axaptafreak: AOT search within search results Blog bot DAX Blogs 0 16.11.2006 17:40
Вопрос про AOT 6apcyk DAX: Программирование 2 29.08.2005 23:18
AOT->documentation Dmitryus DAX: Программирование 3 20.12.2002 10:47
Кое-что нового про AOT Роман Кошелев DAX: База знаний и проекты 2 31.01.2002 09:59

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 23:48.