04.08.2005, 12:14 | #1 |
Участник
|
Какой это объект
Как из кода определить что это
таблица, перечислимый тип, форма и т.д |
|
04.08.2005, 12:19 | #2 |
NavAx
|
а в чем заключается проблема?
|
|
04.08.2005, 12:22 | #3 |
Moderator
|
Мне больше интересно, а в результате чего возникает такая потребность ?
|
|
04.08.2005, 13:52 | #4 |
Участник
|
Выбираете объект, который хотите анализировать.
Например метод класса. Нажимаете на нем правой кнопкой. далее add-ins -> Анализатор кода |
|
04.08.2005, 14:08 | #5 |
Moderator
|
Цитата:
Как из кода.....
Хороших способов я не знаю, поэтому могу предложить два извращенческих 1) перебирать ноды АОТ 2) покопаться в табличке, в которой хранится описание объектов AOT (название не помню, что-то типа Dict*) Но вообще, задача идентификации объекта в run-time, как правило, свидетельствует о неправильном проектировании. |
|
04.08.2005, 14:14 | #6 |
Участник
|
Например в коде есть определение переменной,
VarXXX tempVar; Я не знаю что это за VarXXX, таблица, класс, или еще какой объект, приходится искать пойском. Может есть какой нить путь побыстрее. |
|
04.08.2005, 14:47 | #7 |
Участник
|
.....и опыт, сын ошибок трудных, и гений порадоксов друг .....
Да, согласен, определить из кода тип той или иной переменной довольно трудно, особенно для новичка. Поработаете какое-то время с Аксаптой, а там уж многие объекты будете знать в лицо |
|
04.08.2005, 15:12 | #8 |
Участник
|
Цитата:
Изначально опубликовано TOLK
Например в коде есть определение переменной, VarXXX tempVar; Я не знаю что это за VarXXX, таблица, класс, или еще какой объект, приходится искать пойском. Может есть какой нить путь побыстрее. Scripts\AddIns\OpenNewWindowSelected |
|
04.08.2005, 15:19 | #9 |
Moderator
|
Цитата:
Scripts\AddIns\OpenNewWindowSelected
Поделитесь, если не сложно, вашим классом EditorScripts. Всем полезно будет.
__________________
Андрей. |
|
04.08.2005, 15:29 | #10 |
Участник
|
Да я новичок, и попобывал, нашел только Scripts\AddIns\OpenNewWindows, который открывает только сам объект, код которого я просматриваю, в новом окне
|
|
04.08.2005, 15:29 | #11 |
Участник
|
void addIns_OpenNewWindowSelected(Editor e)
{ TreeNode treeNode; str selectedText; ; selectedText = strRTrim(strLTrim(substr(e.currentLine(), e.selectionStartCol(), e.selectionEndCol() - e.selectionStartCol()))); treeNode = TreeNode::findNode(strFmt('\\Data Dictionary\\Tables\\%1', selectedText)); if (! treeNode) { treeNode = TreeNode::findNode(strFmt('\\Data Dictionary\\Base Enums\\%1', selectedText)); } if (! treeNode) { treeNode = TreeNode::findNode(strFmt('\\Classes\\%1', selectedText)); } if (! treeNode) { treeNode = TreeNode::findNode(strFmt('\\Forms\\%1', selectedText)); } if (! treeNode) { treeNode = TreeNode::findNode(strFmt('\\Data Dictionary\\Extended Data Types\\%1', selectedText)); } if (treeNode) treeNode.AOTnewWindow(); } |
|
04.08.2005, 15:43 | #12 |
Участник
|
Супер, спасибо, работает
Заодно научился как добавлять новый пункт меню, в ниспадающее меню, например коментарии, типа //TOLK "Current Date, "Current Time |
|
19.05.2009, 11:36 | #13 |
Developer
|
Может быть Вам будет полезно это простое решение, хотя оно требует доработки (оптимизации):
|
|
19.05.2009, 12:29 | #14 |
Боец
|
Вот же решение, уже обсуждалось. Автор вроде 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 | #15 |
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.05.2009, 12:23 | #16 |
Боец
|
2 Timofey_k
Вы напишите, в чём отличия. Насколько я понял, 1. Добавлена возможность "прыжка" в макроопределение 2. Обход кривой отрисовки single-элементов для 4-ки (//Workaround for the AX4 "open new window" bug. Remove for AX3/2009) |
|
20.05.2009, 12:49 | #17 |
Участник
|
На всякий случай замечу, что в решении, приведенном 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, 17:12 | #18 |
Microsoft Dynamics
|
DSPIC
Для меня основное отличие в том, что там ничего не добавлено, а написано самостоятельно с нуля (по мотивам анализатора кода) :-) Ну и в целом код малость почище. А так - да, в большинстве случаем результат будет тот же. Владимир Максимов Да, я про название таблицы тоже забыл сказать. Давно уже в трешке не работал. Спасибо. |
|
20.05.2009, 20:16 | #19 |
Боец
|
Timofey_k
Хотелось, чтобы Вы написали в чем отличия - чтобы, не всматриваясь в X++ код, сразу увидеть функциональную разницу между приведенными примерами, чтобы тот, кто увидит эти варианты исполнений, сразу понял, какой именно тянуть себе в карман. Не все же умеют быстро X++ читать Я ни в коем случае не хотел этим сказать - какой из примеров первоисточник || лучше с т.з. написания кода и т.п. Эхх... |
|
21.05.2009, 04:56 | #20 |
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()); } |
|