|
04.08.2005, 12:14 | #1 |
Участник
|
Какой это объект
Как из кода определить что это
таблица, перечислимый тип, форма и т.д |
|
19.05.2009, 11:36 | #2 |
Developer
|
Может быть Вам будет полезно это простое решение, хотя оно требует доработки (оптимизации):
|
|
19.05.2009, 12:29 | #3 |
Боец
|
Вот же решение, уже обсуждалось. Автор вроде miklenew.
Работает при поддержке аксаптовского, движка. Ну невыносимо полезная штука!!! Откывает объект АОТ в новом окне, при этом имя не обязательно должно совпадать. Идёт распознование по типу X++: void AA_NewWindow(Editor e) { TreeNode treeNode = TreeNode::findNode(e.path()); xRefTmpReferences 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(); } |
|
|
За это сообщение автора поблагодарили: mazzy (2), Владимир Максимов (3). |
20.05.2009, 11:41 | #4 |
Microsoft Dynamics
|
Держите самый красивый вариант :-) Года два назад нарисовал бессонной ночью.
X++: //Open the selected element in a new AOT window #AOT void addIns_OpenNewWindowSelected(Editor e) { TreeNode sourceCodeNode = TreeNode::findNode(e.path()); TreeNode newWindowNode; TreeNodePath treeNodePath; xRefTmpReferences refTable; int startLine = e.selectionStartLine(); int startCol = e.selectionStartCol(); int endCol = e.selectionEndCol(); str selectedText; ; if (sourceCodeNode && e.selectionStartLine() == e.selectionEndLine() && startCol != endCol) { infolog.updatexRefSet(sourceCodeNode, true); sourceCodeNode.AOTmakeXref(1); refTable = xRefCreate::makeTmp(infolog.lastxRef()); infolog.updatexRefSet(sourceCodeNode, false); select firstonly refTable where refTable.line == startLine && refTable.Column == startCol; if (refTable) { treeNodePath = refTable.Path(); if (treeNodePath) { newWindowNode = TreeNode::findNode(treeNodePath); if (newWindowNode) { newWindowNode.AOTnewWindow(); if (!newWindowNode.AOTchildNodeCount()) //Workaround for the AX4 "open new window" bug. Remove for AX3/2009 { infolog.getUserSetup().setUserSetup(xUserInfo::find()); } } } } else { e.firstSelectedLine(); selectedText = strLRTrim(subStr(e.getLine(), e.selectionStartCol(), endCol-startCol)); if (selectedText) { newWindowNode = TreeNode::findNode(#MacrosPath + #AOTDelimiter + selectedText); if (newWindowNode) { newWindowNode.AOTedit(); } } } } } |
|
|
За это сообщение автора поблагодарили: sukhanchik (8), aidsua (1), alex55 (3), DSPIC (5). |
20.03.2013, 22:59 | #5 |
Administrator
|
Обновление для AX2012 R2
Вышеприведенный вариант работает вплоть до АХ2009.
Для АХ 2012R2 уже не работает. Прилагаю скорректированный вариант, который будет работать и для AX 2012 R2 и AX2009. Изменения выделены комментариями Цитата:
X++: //Open the selected element in a new AOT window #AOT void addIns_OpenNewWindowSelected(Editor e) { TreeNode sourceCodeNode = TreeNode::findNode(e.path()); TreeNode newWindowNode; TreeNodePath treeNodePath; xRefTmpReferences refTable; int startLine = e.selectionStartLine(); int startCol = e.selectionStartCol(); int endCol = e.selectionEndCol(); str selectedText; xRefUpdateTmpReferences xRefUpdateTmpReferences; // VSUH, Адаптация для AX 2012 R2, 20.03.2013 ; if (sourceCodeNode && e.selectionStartLine() == e.selectionEndLine() && startCol != endCol) { // VSUH, Адаптация для AX 2012 R2 20.03.2013 --> // infolog.updatexRefSet(sourceCodeNode, true); // sourceCodeNode.AOTmakeXref(1); // refTable = xRefCreate::makeTmp(infolog.lastxRef()); // infolog.updatexRefSet(sourceCodeNode, false); xRefUpdateTmpReferences = new xRefUpdateTmpReferences(); xRefUpdateTmpReferences.fillTmpxRefReferences(sourceCodeNode); refTable = xRefUpdateTmpReferences.allTmpxRefReferences(); // VSUH, Адаптация для AX 2012 R2 20.03.2013 <-- select firstonly refTable where refTable.line == startLine && refTable.Column == startCol; if (refTable) { treeNodePath = refTable.Path(); if (treeNodePath) { newWindowNode = TreeNode::findNode(treeNodePath); if (newWindowNode) { newWindowNode.AOTnewWindow(); if (!newWindowNode.AOTchildNodeCount()) //Workaround for the AX4 "open new window" bug. Remove for AX3/2009 { infolog.getUserSetup().setUserSetup(xUserInfo::find()); } } } } else { e.firstSelectedLine(); selectedText = strLRTrim(subStr(e.getLine(), e.selectionStartCol(), endCol-startCol)); if (selectedText) { newWindowNode = TreeNode::findNode(#MacrosPath + #AOTDelimiter + selectedText); if (newWindowNode) { newWindowNode.AOTedit(); } } } } }
__________________
Возможно сделать все. Вопрос времени Последний раз редактировалось sukhanchik; 20.03.2013 в 23:03. |
|
|
За это сообщение автора поблагодарили: Logger (5). |
20.05.2009, 12:23 | #6 |
Боец
|
2 Timofey_k
Вы напишите, в чём отличия. Насколько я понял, 1. Добавлена возможность "прыжка" в макроопределение 2. Обход кривой отрисовки single-элементов для 4-ки (//Workaround for the AX4 "open new window" bug. Remove for AX3/2009) |
|
20.05.2009, 17:12 | #7 |
Microsoft Dynamics
|
DSPIC
Для меня основное отличие в том, что там ничего не добавлено, а написано самостоятельно с нуля (по мотивам анализатора кода) :-) Ну и в целом код малость почище. А так - да, в большинстве случаем результат будет тот же. Владимир Максимов Да, я про название таблицы тоже забыл сказать. Давно уже в трешке не работал. Спасибо. |
|
20.05.2009, 12:49 | #8 |
Участник
|
На всякий случай замечу, что в решении, приведенном DSPIC используется таблица
xRefTmpReferences которая получила такое имя только в AX4. В младших версиях Axapta она называлась также, как и переменная в этом коде TmpxRefReferences Т.е. для версий AX2.5 и AX3.0 надо записать X++: // xRefTmpReferences tmpxRefReferences; // for AX4 and later TmpxRefReferences tmpxRefReferences; // for AX2.5 and AX3.0 |
|
20.05.2009, 20:16 | #9 |
Боец
|
Timofey_k
Хотелось, чтобы Вы написали в чем отличия - чтобы, не всматриваясь в X++ код, сразу увидеть функциональную разницу между приведенными примерами, чтобы тот, кто увидит эти варианты исполнений, сразу понял, какой именно тянуть себе в карман. Не все же умеют быстро X++ читать Я ни в коем случае не хотел этим сказать - какой из примеров первоисточник || лучше с т.з. написания кода и т.п. Эхх... |
|
21.05.2009, 04:56 | #10 |
Microsoft Dynamics
|
DSPIC
Ну вообще-то первое функциональное отличие между двумя скриптами, что в моем надо интересующий объект выделить. :-) Вопрос не принципиальный, но лично мне так удобнее и нагляднее - дабл-клик на любом объекте, а затем вызов скрипта. В остальном принцип один и тот же: пинок стандартному движку перекрестных ссылок (без сохранения в таблицу) и по результату определение типа объекта под курсором. Кстати, в отличие от примитивного поиска текста по AOT, тут требуется, чтобы текущий метод компилировался от начала и до искомого объекта в тексте (включительно). Вот еще до кучи скриптик: переход в анализатор кода прямо из текста метода. X++: //Open the current method in Code Explorer void addIns_CodeExplorer(Editor e) { TreeNode node = TreeNode::findNode(e.path()); HelpGenerator helpGenerator; ; helpGenerator = infolog.helpGenerator(); helpGenerator.showURL('SOURCE:\\\\'+node.treeNodePath()); } |
|