Цитата:
Сообщение от
belugin
Ну во-первых спасибо belugin за его выложенный код по стеку вызовов.
Во-вторых есть возможность решить тоже самое более простым путем (без создания кучи классов), причем решить также и для случая когда SysInfoAction определен в строке инфолога
Итак:
1. Добавляем в табличку SysInfolog поле типа контейнер xppCallStack
2. В Info\add пишем код (в конце метода):
X++:
if (_helpUrl || _sysInfoAction)
{
tmpInfoTable.helpUrl = _helpUrl;
if (_sysInfoAction)
{
tmpInfoTable.action = _sysInfoAction.pack();
tmpInfoTable.actionClassId = classIdGet(_sysInfoAction);
}
else
{
tmpInfoTable.action = conNull();
tmpInfoTable.actionClassId = 0;
}
// Построение стека вызовов -->
tmpInfoTable.xppCallStack = xSession::xppCallStack();
// Построение стека вызовов <--
tmpInfoTable.insert();
tmpActionId[this.line()+1] = tmpInfoTable.recId;
}
// Построение стека вызовов -->
else
{
tmpInfoTable.clear();
tmpInfoTable.xppCallStack = xSession::xppCallStack();
tmpInfoTable.insert();
tmpActionId[this.line()+1] = tmpInfoTable.recId;
}
// Построение стека вызовов <--
Т.е. мы добавляем в эту табличку всегда запись "о себе"
3. Добавляем в форму SysInfologBrowser - в метод context новый menuItem - стек вызовов и кнопку "Стек". На самом деле кнопки достаточно - если она всегда будет отображаться.
4. Создаем свою форму, в данном случае - Dev_StackTrace, с listBox-ом для отображения стека (в Dev_StackTrace есть еще поля - о них речи я не веду, т.к. они не участвуют в отображении стека вызовов)
5. Нехитрый код заполнит listBox (с названием контрола StackListbox):
X++:
int i;
#define.lineToken(' - line ')
;
for (i = 1; i <= conlen(xppCallStack); i += 2)
{
StackListbox.add(strfmt('%1%2%3', conpeek(xppCallStack, i), #lineToken, conpeek(xppCallStack, i + 1)));
}
Здесь - xppCallStack - контейнер стека вызовов, полученный из той самой таблички SysInfolog. Табличка доступна через метод infolog.tmpInfoTable() и в методе context формы SysInfologBrowser доступна как переменная tmpInfo
6. Стандартный класс из таким образом заполненного listbox-а на форме перейдет к коду:
X++:
SysTraceJumpToSource::doJumpToSource(StackListbox.getText(StackListbox.selection()));
7. Если хочется поиграться с кнопкой на форме SysInfologBrowser - то надо немного подправить класс info (увы - именно там определены контролы на форме SysInfologBrowser)
В общем вот так.
Нюансы:
1. Форма SysInfologBrowser всегда загружена - поэтому для ее отладки требуется перезаход в Аксапту
2. После добавления поля в табличку требуется перезаход в Аксапту
3. Не дай Бог вливать все это добро под включенным АОСом - вылетят все и сразу
2EVGL: Дык не у всех же 4.0

Поэтому и облегчают себе жизнь не дожидаясь, когда это будет сделано в ядре 3.0