03.02.2011, 14:43 | #1 |
Участник
|
Как программно узнать текущий объект и метод в котором выполняется код?
Всем здрасте!
Как программно узнать текуций обьект и метод в кором код выполняеться? например чтоб вывело: Classes\MySuperClass\MySuperMethod когда я его из этого метода вызову???? Зарание благодарствуемс... |
|
03.02.2011, 14:54 | #2 |
северный Будда
|
А зачем вам это? Если вы собираетесь делать ветвление в зависимости от источника вызова, то лучше использовать метод construct в классе
__________________
С уважением, Вячеслав |
|
03.02.2011, 14:57 | #3 |
Участник
|
xSession::xppCallStack() - первый элемент контейнера - то, что вам нужно
__________________
Axapta v.3.0 sp5 kr2 |
|
03.02.2011, 14:58 | #4 |
Участник
|
funcname() - возвращает имя метода, но без имени объекта.
|
|
03.02.2011, 15:03 | #5 |
Участник
|
|
|
03.02.2011, 15:08 | #6 |
Участник
|
В тройке из подписи - первый, в 2009-й - то же первый
__________________
Axapta v.3.0 sp5 kr2 |
|
03.02.2011, 15:17 | #7 |
Участник
|
McCoy, а зачем оно вам? Небось очередной универсальный инструмент мастерите? Спрашиваю из чистого любопытства. Рассказывайте, интересно же ведь
У меня например на днях было очень сильное желание иметь инструмент для определения текущего места выполнения чужой сеcсии. Скажем заходим в активные сесси жмём кнопку и видим над чем в данный момент задумалась зависшая обработка. Но похоже, что класс xSession такого не позволяет. А согласитесь было бы интересно. AndyD, спасибо - это я просто заработался. Последний раз редактировалось S.Kuskov; 03.02.2011 в 15:25. |
|
03.02.2011, 16:05 | #8 |
Участник
|
Есть совсем "ручной" способ, который изображен ниже (метод main() класса):
X++: static void main(Args _args) { str nodeName, funcNm; container c; int pos_1, pos_2; ; c = str2con_ru(infolog.getSelectedNodes().toString(), " "); nodeName = conpeek(c, 4); pos_1 = strFind(funcname(), ":", strlen(funcname()), -strlen(funcname())); pos_2 = strFind(funcname(), ".", strlen(funcname()), -strlen(funcname())); if(pos_1) { funcNm = subStr(funcname(), pos_1 + 1, strlen(funcname())); } else if(pos_2) { funcNm = subStr(funcname(), pos_2 + 1, strlen(funcname())); } info(strfmt("%1\\%2", nodeName, funcNm)); }
__________________
С уважением, Александр. |
|
03.02.2011, 16:26 | #9 |
Участник
|
То samolalex, http://msdn.microsoft.com/en-US/library/aa866293.aspx
Цитата:
xInfo.getSelectedNodes Method returns a list of the nodes that are currently selected in the Application Object Tree (AOT).
А то что вы написали можно получить стандартной функцией. Щёлкаете правой мышкой по узлу AOT и в контекстном меню выбираете пункт Настройки/Копировать/Весь путь Последний раз редактировалось S.Kuskov; 03.02.2011 в 16:36. |
|
03.02.2011, 17:11 | #10 |
Участник
|
Цитата:
Как это поможет решить поставленную задачу?
Цитата:
А то что вы написали можно получить стандартной функцией. Щёлкаете правой мышкой по узлу AOT и в контекстном меню выбираете пункт Настройки/Копировать/Весь путь
__________________
С уважением, Александр. |
|
03.02.2011, 17:37 | #11 |
Участник
|
Мне так не кажется Автор ветки говорит, что ему нужен инструмент/функция, которая бы всегда возвращала имя метода в котором она исполняется (видимо для какой-то ручной трассировки, или для универсального макроса). А вы предлагаете искать имя активного в данный момент узла AOT. Дерево репозитария вообще говоря может быть закрыто в момент исполнения пользователем рассматриваемого куска кода.
|
|
|
За это сообщение автора поблагодарили: samolalex (1). |
03.02.2011, 17:40 | #12 |
Участник
|
Цитата:
Дерево репозитария вообще говоря может быть закрыто в момент исполнения пользователем рассматриваемого куска кода.
__________________
С уважением, Александр. |
|
03.02.2011, 17:49 | #13 |
Участник
|
наверно можно где то привязаться к таймеру
и вызывать xSession::xppCallStack() если он изменился выдавать в какую то табличку а вот аргументы и текущее значение объектов наверно сложно получить |
|
03.02.2011, 17:55 | #14 |
Участник
|
Цитата:
Так xSession::xppCallStack() вызванный из фонового процесса будет возвращать стек фонового процесса, а не основного. |
|
03.02.2011, 18:11 | #15 |
Administrator
|
Вот небольшая подборка ссылок по теме стек вызовов.
[ANN] Tabax 0.1 -- панель задач для Axapta - кнопка установки точки останова в info\add для табакса http://www.axaptapedia.com/Infolog_stack_trace - стек вызовов как утилита [ANN] Tabax 0.1 -- панель задач для Axapta - еще один код для установки точки останова в info\add для табакса Скриншот! - тут я описывал как сделать стек вызовов в инфологе для 3.0. В 4.0 и 2009 нужно будет чуть побольше для этого кода написать (там упаковку записи сделали - вот там и добавить нужно новый параметр)
__________________
Возможно сделать все. Вопрос времени Последний раз редактировалось sukhanchik; 03.02.2011 в 18:13. |
|
|
За это сообщение автора поблагодарили: Logger (3), kornix (3). |
25.02.2011, 23:34 | #16 |
Участник
|
У меня вот прям сейчас тоже точно такое же желание Не придумали ничего ?
|
|
|
|