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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 01.12.2006, 18:03   #1  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
EditorScripts - addIns_OpenInAOT
Вот, попросили написать скрипт для открытия выделенного в редакторе объекта в АОТ.

Описание возможностей + код можно скачать здесь:
http://www.axaptapedia.com/Editor_scripts_OpenInAOT
За это сообщение автора поблагодарили: konfet (1), belugin (10), zemlyn (1), sukhanchik (2), Alex_KD (1).
Старый 03.12.2006, 01:37   #2  
Alex_KD is offline
Alex_KD
Участник
AxAssist
MCBMSS
Соотечественники
 
522 / 362 (14) ++++++
Регистрация: 06.07.2006
Адрес: Melbourne, Down Under
Thumbs up
Супер. Как раз тем же занимаюсь =)
Старый 04.12.2006, 09:57   #3  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Наверное, моё первое расширение для аксапты
Недостатки по сравнению с кодом Ивана:
  • работает только с выделенным фрагментом
  • не пытается редактировать при помощи AOTEdit
(Надо это всё украсть)

Достоинства:
Изображения
 
Вложения
Тип файла: zip go_component.zip (5.3 Кб, 81 просмотров)
Старый 04.12.2006, 10:37   #4  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Украл
1. теперь переходит по идентификатору на котором находится курсор в редакторе
2. теперь если есть исходник, то открывает его в редакторе а не в АОТ
3. Кусок для AutoHotKey
Ctrl+Enter - вызов из редактора
Win+X - вызов из GlobalToolsMenu (если туда запихать форму)
Код:
#IfWinActive, ahk_class AxaptaClientClassName
#x::
  	WinMenuSelectItem,,,Сервис,Go component
Exit
#IfWinActive, ahk_class AxaptaClientClassName
~^Enter::
     toEnglish()
     SendInput,{APPSKEY}sg
Exit
Вложения
Тип файла: zip go_component.zip (5.6 Кб, 156 просмотров)
Старый 07.12.2006, 17:41   #5  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Импортировал себе вчера GoComponent - и честно говоря, что удивило, не особо понравилось.
То есть мой скриптик мне более удобно оказалось использовать.

Так что, качаем, сравниваем, выбираем.
Заодно пишем, чего кому и почему больше нравится.

З.Ы. И еще, чего не хватает той или иной утилитке

Последний раз редактировалось kashperuk; 07.12.2006 в 17:44.
Старый 08.12.2006, 11:05   #6  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,324 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Когда-то писал подобное... Так что голосую за kashperuk
Что хочется отметить:
1. Не хвататет для полного счастья макросов и методов класса Global:
X++:
    if (selectedLine)
    {
        //The main elementTypes - can be extended
        add2Set(#ExtendedDataTypesPath);
        add2Set(#BaseEnumsPath);
        add2Set(#TablesPath);
        add2Set(#ClassesPath);
        add2Set(#FormsPath);
        add2Set(#ReportsPath);
        add2Set(#MacrosPath); // Macros

        //if nothing was found in the AOT, we'll try searching in systemDocumentation
        if (selectedNodesSet.elements() == 0)
        {
            add2Set(#SystemFunctionsPath);
            add2Set(#SystemTablesPath);
            add2Set(#SystemTypesPath);
            add2Set(#SystemEnumsPath);
            add2Set(#SystemClassesPath);
            add2Set(#ClassesPath + #AOTRootPath + classstr(Global)); // Global
        }
2. Формы и отчеты - не нужны - только сбивают с толку. Если этим скриптом пользоваться из кода, то нельзя объявить переменную типа названия формы. В то же время может существовать таблица/класс/едт который совпадает с названием формы. А значит скрипт откроет лишние окна. В случае макросов - по идее тоже можно провести анализ на наличие перед названием - символа # или фразы GlobalMacro - но для простоты так делать не хочется

3. Открываются сразу 2 окна (в случае системной доки) - одно окно узла и другое - окно редактора. Окно узла - лишнее - его вполне можно убрать - сделав в коде анализ типа узла. Также вылезает окно свойств - что как мне кажется только мешает. Хотя как говорится на вкус и цвет товарищей нет.

В общем - это пока только те вещи, которые можно убрать из кода (если конечно доберусь - то исправлю - а если нет (что скорее всего) - то пусть останутся просто моим мнением)

4. Что еще можно сделать (автор идеи - db) - это построить по узлу, который открыт в редакторе перекрестные ссылки (табл TmpxRefReferences и класс xRefCreate) и делать тоже самое - только выделяя переменные, а не сами названия узлов АОТ

5. Ну и в заключение - можно еще искать контролы на форме/отчете с AutoDeclaration=Yes. Для этого нужно убедиться, что редактор открыт у формы/отчета и путем перебора дерева контролов можно найти сей контрол.
Код у меня он оформлен как 2 вспомогательных метода, что с ходу не впишется в представленный скрипт. Однако идею можно переработать.
X++:
// _sourceNode = '\\Forms\\Address' (к примеру), получается через TreeNode::findNode(e.path()).AOTParent().TreeNodePath()
// _declaration - тоже самое что и selectedLine
public TreeNode findControlNode(TreeNode _sourceNode, str _declaration)
{
    TreeNode       declTreeNode;
    TreeNode       ret;
    int            i;
    str            s;
    #AOT
    ;
    i = strfind(_sourceNode.treeNodePath(), '\\', strlen(#AOTRootPath) + 1, strlen(_sourceNode.treeNodePath()));
    if (i < 1)
    {
        return ret;
    }
    s = substr(_sourceNode.treeNodePath(), 1, i - 1);
    i = strfind(_sourceNode.treeNodePath(), '\\', strlen(s) + 2, strlen(_sourceNode.treeNodePath()));
    switch (s)
    {
        case #FormsPath, #ReportsPath:
            s = substr(_sourceNode.treeNodePath() + '\\Designs', 1, i - 1);
            ret = this.findSubNode(TreeNode::findNode(s), _declaration);
            break;
        default:
    }
    return ret;
}
Код функции findSubNode
X++:
private TreeNode findSubNode(TreeNode _startNode, TreeNodeName _nodeName, TreeNode _parentNode = null)
{
    int              i;
    TreeNode         curNode, subNode;
    TreeNodeIterator it;
    TreeNodePath     subNodePath;
    ;
    curNode = _parentNode ? _parentNode : _startNode;
    it = curNode.AOTiterator();
    subNode = it.next();
    while (subNode)
    {
        subNodePath = subNode.treeNodePath();
        if (this.isNodeOk(subNode, _nodeName))
        {
            break;
        }
        if (subNode.AOTchildNodeCount() > 0)
        {
            subNode = this.findSubNode(_startNode, _nodeName, subNode);
            subNodePath = '';
            if (subNode)
            {
                subNodePath = subNode.treeNodePath();
            }
        }
        if (this.isNodeOk(subNode, _nodeName))
        {
            break;
        }
        else
        {
            subNode = it.next();
            subNodePath = '';
        }
    }
    return subNode;
}
__________________
Возможно сделать все. Вопрос времени

Последний раз редактировалось sukhanchik; 08.12.2006 в 11:08.
За это сообщение автора поблагодарили: kashperuk (3).
Старый 08.12.2006, 11:12   #7  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Слегка поменял EditorScript - теперь в случае только одного варианта окно не мигает
X++:
// util, bmi, 23.06.04
void go(Editor e)
{
    boolean activate;
    boolean hasSelection()
    {
        return e.selectionStartCol()!=e.selectionEndCol();
    }
    str selection()
    {
    ;
        return subStr(e.currentLine(),
                      e.selectionStartCol(),
                      e.selectionEndCol()-e.selectionStartCol());

    }
    boolean isIdentifier(str _char)
    {
        return match('[a-z0-9_]', _char);
    }
    str currentIdentifier()
    {
        str line = e.currentLine();
        int pos;
        int idStart;
    ;
        for(pos = e.selectionStartCol(); pos >= 0 && isIdentifier(subStr(line, pos, 1)); pos--)
            pos=pos;
        idStart = pos + 1;

        for(pos = e.selectionStartCol()+1; pos <= strLen(line) && isIdentifier(subStr(line, pos, 1)); pos++)
            pos=pos;

        return subStr(line, idStart, pos - idStart);
    }
    str currentText()
    {
        return hasSelection() ? selection() : currentIdentifier();
    }
    void goComponent(str _componentName="")
    {
        FormRun r;
        Object o;
        SysGlobalCache cache=infolog.globalCache();
        boolean go;
    ;
        if(cache.isSet(formStr(Dev_GoComponent), 'running'))
        {
            r=cache.get(formStr(Dev_GoComponent), 'running');
            activate = true;
        }
        else
        {
            r=new FormRun(new Args(formStr(Dev_GoComponent)));
            r.init();
        }
        o=r;
        o.componentName(_componentName);
        if (o.isSingle())
        {
            go = o.go();
        }

        if(go)
        {
            r.close();
        }
        else
        {
            if (activate)
                infolog.activateWindow(r.hWnd());
            else
                r.run();
            r.detach();
        }
    }
;
    goComponent(currentText());
}
Теги
открыть переменную

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Шаблон комментария blitzkrieg DAX: Программирование 6 06.11.2010 06:54
Kashperuk Ivan: EditorScripts.addIns_OpenInAOT - version 2 Blog bot DAX Blogs 0 29.05.2008 17:05
Kashperuk Ivan: EditorScripts.addIns_OpenInAOT() script updateHO... Blog bot DAX Blogs 0 08.02.2007 22:31
Dynamics AX Geek: Productivity tip: classes EditorScripts & xppSource Blog bot DAX Blogs 0 28.10.2006 16:40
Как создать свой сценарий Diman DAX: Программирование 1 15.08.2003 10:55

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

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

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