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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 25.01.2013, 23:06   #21  
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, 10:00   #22  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Можно ли как-то проапгрейдить данный код Открыть в новом окне объект из кода, чтобы в classDeclaration классов открывался именно тот класс, на котором стоит курсор, а не его базовый?
Старый 25.11.2013, 22:38   #23  
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).
Старый 31.01.2023, 14:49   #24  
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).
Старый 31.01.2023, 17:31   #25  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
похоже непонятно описание составил, задают уточняющие вопросы.

в общем в куче мест вместо
X++:
        appl.updatexRefSet(true);
        memberFunction.aoTmakeXref(1);
        tmpxRefReferences = xRefCreate::makeTmp(appl.lastxRef(), memberFunction.treeNodePath());
        appl.updatexRefSet(false);
написано просто
X++:
        memberFunction.aoTmakeXref(1);
        tmpxRefReferences = xRefCreate::makeTmp(appl.lastxRef(), memberFunction.treeNodePath());
и этот короткий способ тормозит
Теги
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:31.