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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.05.2008, 16:18   #1  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Открыть в новом окне объект из кода
Если кликнуть в какой-нибудь участок кода и выбрать NewWindows, то система проанализирует на каком объекте мы стоим и откроет этот объект в новом окне.
Если это табличная переменная, система сделает анализ от какой таблицы она образована и откроет эту таблицу.
Выделять объект не надо. Просто ткнуть в этот объект.
Добавить в класс EditorScripts.
X++:
void AA_NewWindow(Editor e)
{
    TreeNode            treeNode = TreeNode::findNode(e.path());
    TmpxRefReferences   tmpxRefReferences;
    Column              nCol = e.columnNo() + 1;
    Line                nLine = e.currentLineNo() + 1;
    ;
    treeNode.AOTmakeXref(1);
    tmpxRefReferences = xRefCreate::makeTmp(infolog.lastxRef());

    select firstonly tmpxRefReferences
        order by Column desc
        where tmpxRefReferences.line == nLine &&
              tmpxRefReferences.Column <= nCol;

    if (!tmpxRefReferences)
        return;

    treeNode = TreeNode::findNode(tmpxRefReferences.path());

    if (treeNode)
        treeNode.AOTnewWindow();
}

Последний раз редактировалось miklenew; 29.05.2008 в 12:17.
За это сообщение автора поблагодарили: mazzy (2), AlGol (1), kashperuk (5), Logger (4), Eldar9x (5), alex55 (1), Dima_Dima (1), Kabardian (5).
Старый 28.05.2008, 17:29   #2  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Кстати, если это работает и не требует наличия перекрестных ссылок (вот в этом я сомневаюсь) - то это решение намного быстрее и элегантнее, чем мои наработки.

Завтра попробую поэкспериментировать с этим кодом.
За это сообщение автора поблагодарили: Gustav (11), miklenew (2).
Старый 28.05.2008, 17:40   #3  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от kashperuk Посмотреть сообщение
...и не требует наличия перекрестных ссылок (вот в этом я сомневаюсь)...
Судя по другому топику и схожести идентификаторов в коде, они-таки требуются
Цитата:
Сообщение от miklenew Посмотреть сообщение
Для работы обязательно наличие перекрёстных ссылок.
Старый 28.05.2008, 19:07   #4  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Кстати, если это работает и не требует наличия перекрестных ссылок (вот в этом я сомневаюсь) - то это решение намного быстрее и элегантнее, чем мои наработки.
Завтра попробую поэкспериментировать с этим кодом.
Требуются, при обращении к xRefNames.
tmpxRefReferences система сама хитро делает без ссылок.
Конструкция
X++:
    treeNode.AOTmakeXref(1);
    tmpxRefReferences = xRefCreate::makeTmp(infolog.lastxRef());
разрывает код на множество мелких кусочков.
За это сообщение автора поблагодарили: kashperuk (2), Logger (3).
Старый 28.05.2008, 18:02   #5  
konopello is offline
konopello
SAP
SAP
 
628 / 76 (4) ++++
Регистрация: 08.11.2005
Адрес: Минск
а куда в 4ке дели ParserClass?
Старый 28.05.2008, 18:44   #6  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
нету его больше (поищите сообщение от Мариночки)
Старый 28.05.2008, 20:25   #7  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Огого !

в 3-ке тоже работает !

И без всяких перекрестных ссылок !
Старый 29.05.2008, 12:01   #8  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Немного модифицированная версия (исправлен небольшой баг) для АХ 2009 и АХ 4.0

X++:
public void addIns_OpenInAOT(Editor e)
{
    #AOT
    TreeNode            treeNode = TreeNode::findNode(e.path());
    xRefTmpReferences   xRefTmpReferences;
    Column              nCol = e.columnNo() + 1;
    Line                nLine = e.currentLineNo() + 1;
    ;
    treeNode.AOTmakeXref(1);
    xRefTmpReferences = xRefCreate::makeTmp(infolog.lastxRef());

    select firstonly xRefTmpReferences
        order by Column desc
        where xRefTmpReferences.line == nLine &&
              xRefTmpReferences.Column <= nCol;

    if (!xRefTmpReferences)
        return;

    treeNode = TreeNode::findNode(xRefTmpReferences.path());

    if (treeNode)
        treeNode.AOTnewWindow();
}
Еще раз спасибо, miklenew - очень понравился метод
За это сообщение автора поблагодарили: miklenew (3), alex55 (1).
Старый 29.05.2008, 12:21   #9  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Немного модифицированная версия (исправлен небольшой баг) для АХ 2009 и АХ 4.0
Спасибо. Твоя версия мне больше понравилась не думал что path даст мне нужный результат.
Исправил в первоначальном посте. Для 3.0.
Разница между 4.0 и 3.0 не большая, похоже в 4.0 не много изменилось имя таблицы TmpxRefReferences стала xRefTmpReferences.
Старый 29.05.2008, 12:30   #10  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
А вместо Sidax лучше попробуй Tabax - там точно есть поддержка нескольких языков + больше полезной функциональности и возможность использования плагинов (есть у меня пару интересных )
Старый 29.05.2008, 12:45   #11  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Цитата:
Сообщение от kashperuk Посмотреть сообщение
А вместо Sidax лучше попробуй Tabax - там точно есть поддержка нескольких языков + больше полезной функциональности и возможность использования плагинов (есть у меня пару интересных )
Спасибо. Tabax понравился буду использовать. Удобнее. Более не заметный.
А как плагины используешь? Добавляешь ещё одну кнопку в панель?
Старый 29.05.2008, 12:55   #12  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Вот здесь все написано
http://www.axaptapedia.com/Tabax

По сути, плагины бывают 2 типов:
- картинку нужно положить в определенную папочку (картинка обычно идет вместе с проектом)
- просто загрузить проект - картинка используется или стандартная или извратно хранится непосредственно в ХРО

Перечень плагинов доступных там на страничке тоже приведен
Старый 29.05.2008, 13:26   #13  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Masia еще сделала возможность делать плагины ресурсами (актуально для Ax4, где общей шары у пользователей может не быть), но я пока не вливал эти изменения.

А вот фича - получения скриншота текущего окна внутри аксапты по Shift + кнопка "Копировать"

\Forms\Tabax\Methods\copyActiveWindowScreenShot
X++:
void copyActiveWindowScreenShot()
{
    Image image = new Image();
;
    image.captureWindow(topmost);
    image.clipboardCopy();
}
\Forms\Tabax\Designs\Design\[Group:toolbar]\Button:copyBut\Methods\clicked
X++:
void clicked()
{
    SysContextMenu context;
    TextBuffer buf=new TextBuffer();
    TreeNode node;
    boolean first=true;
    ;
    if (WinApi::isShiftButtonDown() && !WinApi::isControlButtonDown())
    {
        element.copyActiveWindowScreenShot();
    }
    else
    {
        if (element.currentFormRun())
        {
            buf.appendText(element.AxPath_fromFormRun(element.currentFormRun()));
            buf.toClipboard();
        }
        else
        {
            context = element.currentSysContextMenu();
            if (hasSecurityKeyAccess(securityKeyNum(SysDevelopment), AccessType::Edit) && context)
            {
                node = context.first();
                while(node)
                {
                    buf.appendText(
                        (!first ? "\r\n" :"")
                        +
                        (WinApi::isControlButtonDown() ?
                            (WinApi::isShiftButtonDown() ?
                                element.AxPath_fromTreeNode(node)
                                :
                                node.treeNodePath()
                            )
                            :
                            node.treeNodeName()
                        )
                    );
                    node=context.next();
                    first=false;
                }
                context.finalize();
                buf.toClipboard();
            }
        }
    }
}
За это сообщение автора поблагодарили: alex55 (1).
Старый 29.05.2008, 16:44   #14  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
А как в этом случае можно переписать код скрипта gotoDeclaration ?
Т.е. не открыть окно с объявлением типа, а перейти туда где объявлена соответствующая переменная ?
Старый 06.06.2010, 17:06   #15  
alex55 is offline
alex55
MCTS
MCBMSS
 
224 / 145 (5) +++++
Регистрация: 13.02.2007
Адрес: Москва
Цитата:
Сообщение от Logger Посмотреть сообщение
А как в этом случае можно переписать код скрипта gotoDeclaration ?
Т.е. не открыть окно с объявлением типа, а перейти туда где объявлена соответствующая переменная ?
AXGoToDeclarationXRef - утилита перехода к объявлению переменной
Старый 25.01.2013, 23:06   #16  
alex55 is offline
alex55
MCTS
MCBMSS
 
224 / 145 (5) +++++
Регистрация: 13.02.2007
Адрес: Москва
Версия для AX 2012

Преимущества перед F12:
- Сразу открывает объект а не переходит сначала к определению переменной.;
- Работает в ряде случаев, когда не работает F12 (системные объекты, параметры методов и т.п.);
- Работает с макросами (при полном выделению имени). За идею спасибо Timofey_k;

Особенности:
- В данной реализации при запуске из job система делает попытку закрыть текущее окно редактора. В качестве воркэраунда используется переоткрытие исходного окна (за идею также спасибо Timofey_k).

X++:
//AX2012 version
public void aaaOpenInAOT(Editor e)
{
    #AOT
    #define.AOTPathDivider('\\')
    
    TreeNode            treeNode    = TreeNode::findNode(e.path());       
    xRefTmpReferences   xRefTmpReferences;
    Column              nCol  = e.columnNo() + 1;
    Line                nLine = e.currentLineNo() + 1;
    int                 startCol  = e.selectionStartCol();
    int                 endCol    = e.selectionEndCol();
    str                 macroName;
    str                 nodePath;
    str                 curPath   = e.path(); 
    ;

    treeNode.AOTmakeXref(1);
    
    xRefTmpReferences = xRefCreate::makeTmp(appl.lastxRef());

    select firstonly xRefTmpReferences
        order by Column desc
        where xRefTmpReferences.line == nLine &&
              xRefTmpReferences.Column <= nCol;

    if (!xRefTmpReferences)
    {
        e.firstSelectedLine();
        macroName = strLRTrim(subStr(e.getLine(), e.selectionStartCol(), endCol - startCol));

        if (macroName)
        {
            treeNode = TreeNode::findNode(#MacrosPath + #AOTDelimiter + macroName);

            if (treeNode)
            {
                treeNode.AOTedit();
            }
        }

        return;
    }

    nodePath = xRefTmpReferences.calcPath();

    if (nodePath)
    {
        treeNode = TreeNode::findNode(nodePath);

        if (treeNode)
        {          
            if (strScan(curPath, #JobsPath + #AOTPathDivider, 1, strLen(curPath)))
            {
                //Workaround for jobs behaviour in the AX2012
                SysUtil::editPathLogicalPos(curPath, nLine, nCol);            
            }

            treeNode.AOTnewWindow();
        }
    }

    return;
}

Последний раз редактировалось alex55; 25.01.2013 в 23:14.
За это сообщение автора поблагодарили: Logger (3).
Старый 25.11.2013, 22:38   #17  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Цитата:
Сообщение от alex55 Посмотреть сообщение
Версия для AX 2012
...
Спасибо дружище! С выходом 2012R2 старая версия перестала работь и я было уже попрощался с этой фичей. Сравнив твой код с предыдущей версией выяснил что концептуальня разница лишь в одной строке:

До 2012R2:
X++:
tmpxRefReferences = xRefCreate::makeTmp(infolog.lastxRef());
После 2012R2:
X++:
tmpxRefReferences = xRefCreate::makeTmp(appl.lastxRef());
Awesome!
За это сообщение автора поблагодарили: Logger (19).
Старый 29.05.2008, 17:02   #18  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
xppscanner + собственный синтаксический разбор
Старый 25.11.2013, 10:00   #19  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Можно ли как-то проапгрейдить данный код Открыть в новом окне объект из кода, чтобы в classDeclaration классов открывался именно тот класс, на котором стоит курсор, а не его базовый?
Старый 31.01.2023, 14:49   #20  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Обнаружена еще одна интересная особенность работы с TreeNode.AOTmakeXref()
Оказывается в стандартном коде в большинстве мест этот метод обрамляется отключением записи собираемых перекрестных ссылок в постоянную таблицу, за счет чего ускоряется работа этого метода

Например так
\Classes\EditorScripts\documentation_HeaderTemplate
2012-я
X++:
        appl.updatexRefSet(true);
        memberFunction.aoTmakeXref(1);
        tmpxRefReferences = xRefCreate::makeTmp(appl.lastxRef(), memberFunction.treeNodePath());
        appl.updatexRefSet(false);
2009-я
X++:
        infolog.updatexRefSet(this, true);
        memberFunction.AOTmakeXref(1);
        tmpxRefReferences = xRefCreate::makeTmp(infolog.lastxRef(), memberFunction.treeNodePath());
        infolog.updatexRefSet(this, false);
А в популярных доработках к EditorScripts (открыть узел в AOT, перейти к определению переменной итп), в HK Framework итп, в общем, везде, где используются собираемые на лету перекрестные ссылки - этого не делается. Из-за этого в 12-ке бывает заметно подтормаживает и нервирует. Иногда замедление измеряется в секундах. Чаще меньше секунды но все равно напрягает.

Написал свой метод xRefCreate::makeTmpByTreeNode_MRC, который заменяет вызов
X++:
        appl.updatexRefSet(true);
        memberFunction.aoTmakeXref(1);
        tmpxRefReferences = xRefCreate::makeTmp(appl.lastxRef(), memberFunction.treeNodePath());
        appl.updatexRefSet(false);
и везде его использую

X++:
/// <summary>
/// Рекомендуется вместо treeNode.aotMakeXref(1); tmpxRefReferences = xRefCreate::makeTmp(appl.lastxRef());
/// </summary>
/// <param name="_treeNode">
/// TreeNode, для которого собираем временные перекрестные ссылки
/// </param>
/// <param name="_flag">
/// 1-й параметр _flag, передаваемый в treeNode.aotMakeXref(_flag)
/// </param>
/// <param name="_xRefAll">
/// 2-й параметр _xRefAll, передаваемый в treeNode.aotMakeXref(_flag, _xRefAll)
/// </param>
/// <param name="_path">
/// параметр _path передаваемый в xRefCreate::makeTmp()
/// </param>
/// <returns>
/// Временная таблица xRefTmpReferences с результатами сбора перекрестных ссылок по treenode
/// </returns>
/// <remarks>
/// [url=http://axforum.info/forums/showthread.php?p=299419#post299419]Открыть в новом окне объект из кода[/url]
/// В 2012-й вызов treeNode.aotMakeXref(1) работает быстрее если 
/// обрамить его отключением сохранения перекрестных ссылок
/// см. пример в стандартном коде в \Classes\EditorScripts\documentation_HeaderTemplate
/// 
/// метод makeTmpByTreeNode_MRC сделан для удобства, для замены куска кода 
///         appl.updatexRefSet(true);
///         treeNode.aotMakeXref(1);
///         tmpxRefReferences = xRefCreate::makeTmp(appl.lastxRef(), treeNode.treeNodePath());
///         appl.updatexRefSet(false);
/// одной строкой кода с вызовом этого метода
///         xRefCreate::makeTmpByTreeNode_MRC(treeNode, 1, false /*default value*/, treeNode.treeNodePath());
/// </remarks>

// JEV007437, PKoz 31.01.2023

public static xRefTmpReferences makeTmpByTreeNode_MRC(
    TreeNode    _treeNode,
    int         _flag    = 1, // обычно 1
    boolean     _xRefAll = false,
    xRefPath    _path    = '' // в стандарте обычно _treeNode.treeNodePath()
    )
{
    xRefTmpReferences   tmpxRefReferences;
    boolean             temporaryForbidSaveXref;
    ;

    temporaryForbidSaveXref = appl.canUpdatexRef();
    if (temporaryForbidSaveXref)
    {
        appl.updatexRefSet(true);
    }

    _treeNode.aotMakeXref(_flag, _xRefAll);
    tmpxRefReferences = xRefCreate::makeTmp(appl.lastxRef(), _path);

    if (temporaryForbidSaveXref)
    {
        appl.updatexRefSet(false);
    }

    return tmpxRefReferences;
}
За это сообщение автора поблагодарили: demianimp (4), gl00mie (10).
Теги
ax2012, ax2012r2, axapta, editor script

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Размер шрифта в окне редактора кода Jox DAX: Администрирование 3 09.11.2022 11:49
Открыть дизайн формы в режиме Edit из кода arnold DAX: Программирование 11 27.11.2008 16:20
Не могу открыть объект в 1с. Tolikv DAX: Программирование 13 17.05.2007 09:41
Вебинтерфейс. Создание строк, их выбор. Отркытие страницы в новом окне IvanS DAX: Программирование 3 27.10.2006 10:54
проблема с настройкой штрихового кода Nic DAX: Функционал 4 27.12.2004 09:04
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

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

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

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