Показать сообщение отдельно
Старый 08.04.2013, 15:15   #5  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
Цитата:
Сообщение от DSPIC Посмотреть сообщение
Кстати, а зачем там pack\unpack ?
Смотри метод info.add. Четвертым параметром в этот метод передается класс, наследник от SysInfoAction. Дальше в этом методе есть такой код:
X++:
        if (_sysInfoAction)
        {
            packedAction  = _sysInfoAction.pack();
            actionClassId = classidget(_sysInfoAction);
        }
        else
        {
            packedAction  = connull();
            actionClassId = 0;
        }

        this.addSysInfoAction(_helpUrl, actionClassId, packedAction);
Т.е. переданный класс пакуется, запоминается конкретный Id класса и все это сохраняется во временную таблицу SysInfolog:
X++:
void addSysInfoAction(
    str _helpUrl,
    int actionClassId,
    container action)
{
    tmpInfoTable.HelpUrl       = _helpUrl;
    tmpInfoTable.Action        = action;
    tmpInfoTable.ActionClassId = actionClassId;

    tmpInfoTable.insert();
    tmpActionId[this.line()+1] = tmpInfoTable.RecId;
}
Форма, которая отображает infolog - это SysInfologBrowser. Эта форма содержит вышеописанную временную таблицу. По двойному клику на инфологе происходит позиционирование на конкретном курсоре временной таблицы, создание экземпляра класса по сохраненному classId, распаковка класса, согласно сохраненным данным и запуск класса:
X++:
void executeAction()
{
    DictClass     dictClass;
    SysInfoAction sysInfoAction;
    HelpGenerator helpGenerator;

    if (sysInfolog.ActionClassId)
    {
        dictClass = new DictClass(sysInfolog.ActionClassId);
        sysInfoAction = dictClass.makeObject();
        sysInfoAction.unpack(sysInfolog.Action, infolog.infoActionObject());
        sysInfoAction.run();
    }
    else
    {
        helpGenerator = infolog.helpGenerator();
        if (sysInfolog.HelpUrl)
            helpGenerator.showURL(sysInfolog.HelpUrl);
        else
            helpGenerator.showURL('INFOLOG:\\\\'+int642str(sysInfolog.RecId));
    }
}
И здесь как раз засада - args не пакуется, следовательно класс не отрабатывает как ему положено.
За это сообщение автора поблагодарили: dn (4), DSPIC (10).