|
28.05.2008, 16:18 | #1 |
Участник
|
Открыть в новом окне объект из кода
Если кликнуть в какой-нибудь участок кода и выбрать 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 |
Участник
|
Кстати, если это работает и не требует наличия перекрестных ссылок (вот в этом я сомневаюсь) - то это решение намного быстрее и элегантнее, чем мои наработки.
Завтра попробую поэкспериментировать с этим кодом. |
|
|
За это сообщение автора поблагодарили: Gustav (11), miklenew (2). |
28.05.2008, 17:40 | #3 |
Moderator
|
|
|
28.05.2008, 19:07 | #4 |
Участник
|
Цитата:
tmpxRefReferences система сама хитро делает без ссылок. Конструкция X++: treeNode.AOTmakeXref(1); tmpxRefReferences = xRefCreate::makeTmp(infolog.lastxRef()); |
|
|
За это сообщение автора поблагодарили: kashperuk (2), Logger (3). |
28.05.2008, 18:02 | #5 |
SAP
|
а куда в 4ке дели ParserClass?
|
|
28.05.2008, 18:44 | #6 |
Участник
|
нету его больше (поищите сообщение от Мариночки)
|
|
28.05.2008, 20:25 | #7 |
Участник
|
Огого !
в 3-ке тоже работает ! И без всяких перекрестных ссылок ! |
|
29.05.2008, 12:01 | #8 |
Участник
|
Немного модифицированная версия (исправлен небольшой баг) для АХ 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 (3), alex55 (1). |
29.05.2008, 12:21 | #9 |
Участник
|
Цитата:
Исправил в первоначальном посте. Для 3.0. Разница между 4.0 и 3.0 не большая, похоже в 4.0 не много изменилось имя таблицы TmpxRefReferences стала xRefTmpReferences. |
|
29.05.2008, 12:30 | #10 |
Участник
|
А вместо Sidax лучше попробуй Tabax - там точно есть поддержка нескольких языков + больше полезной функциональности и возможность использования плагинов (есть у меня пару интересных )
|
|
29.05.2008, 12:45 | #11 |
Участник
|
Цитата:
А как плагины используешь? Добавляешь ещё одну кнопку в панель? |
|
29.05.2008, 12:55 | #12 |
Участник
|
Вот здесь все написано
http://www.axaptapedia.com/Tabax По сути, плагины бывают 2 типов: - картинку нужно положить в определенную папочку (картинка обычно идет вместе с проектом) - просто загрузить проект - картинка используется или стандартная или извратно хранится непосредственно в ХРО Перечень плагинов доступных там на страничке тоже приведен |
|
29.05.2008, 13:26 | #13 |
Участник
|
Masia еще сделала возможность делать плагины ресурсами (актуально для Ax4, где общей шары у пользователей может не быть), но я пока не вливал эти изменения.
А вот фича - получения скриншота текущего окна внутри аксапты по Shift + кнопка "Копировать" \Forms\Tabax\Methods\copyActiveWindowScreenShot X++: void copyActiveWindowScreenShot() { Image image = new Image(); ; image.captureWindow(topmost); image.clipboardCopy(); } 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 |
Участник
|
А как в этом случае можно переписать код скрипта gotoDeclaration ?
Т.е. не открыть окно с объявлением типа, а перейти туда где объявлена соответствующая переменная ? |
|
25.01.2013, 23:06 | #16 |
MCTS
|
Версия для 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 |
Боец
|
Спасибо дружище! С выходом 2012R2 старая версия перестала работь и я было уже попрощался с этой фичей. Сравнив твой код с предыдущей версией выяснил что концептуальня разница лишь в одной строке:
До 2012R2: X++: tmpxRefReferences = xRefCreate::makeTmp(infolog.lastxRef()); X++: tmpxRefReferences = xRefCreate::makeTmp(appl.lastxRef()); |
|
|
За это сообщение автора поблагодарили: Logger (19). |
29.05.2008, 17:02 | #18 |
Участник
|
xppscanner + собственный синтаксический разбор
|
|
25.11.2013, 10:00 | #19 |
MCTS
|
Можно ли как-то проапгрейдить данный код Открыть в новом окне объект из кода, чтобы в classDeclaration классов открывался именно тот класс, на котором стоит курсор, а не его базовый?
|
|
31.01.2023, 14:49 | #20 |
Участник
|
Обнаружена еще одна интересная особенность работы с TreeNode.AOTmakeXref()
Оказывается в стандартном коде в большинстве мест этот метод обрамляется отключением записи собираемых перекрестных ссылок в постоянную таблицу, за счет чего ускоряется работа этого метода Например так \Classes\EditorScripts\documentation_HeaderTemplate 2012-я X++: appl.updatexRefSet(true); memberFunction.aoTmakeXref(1); tmpxRefReferences = xRefCreate::makeTmp(appl.lastxRef(), memberFunction.treeNodePath()); appl.updatexRefSet(false); X++: infolog.updatexRefSet(this, true); memberFunction.AOTmakeXref(1); tmpxRefReferences = xRefCreate::makeTmp(infolog.lastxRef(), memberFunction.treeNodePath()); infolog.updatexRefSet(this, false); Написал свой метод 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). |