Показать сообщение отдельно
Старый 27.05.2015, 15:28   #11  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,656 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Вы бы сделали хотя бы поиск по данному форуму по ключевому слову "ComDispFunction". Есть масса примеров его использования.

В данном конкретном случае решение будет выглядеть так:

Сначала коллекция листов (рабочая книга. Файл Excel)

X++:
// Метод getWorkSheets()
private COM getWorkSheets()
{
    ComVariant  varRet;
    ComDispFunction funcGet;
    ;

    if (!comWorkSheets && m_comDocument)
    {
        try
        {
            /*
            comWorkSheets = m_comDocument.worksheets();
            */
            funcGet = new ComDispFunction(m_comDocument, "worksheets", COMDispContext::PropertyGet);
            varRet  = new COMVariant(COMVariantInOut::OUT_RETVAL, COMVariantType::VT_DISPATCH);
            funcGet.call(varRet);
            comWorkSheets = COM::createFromInterface(varRet.iDispatch());
        }

        catch (Exception::Error)
        {
            throw error("@GEE6043");
        }
    }

    return comWorkSheets;
}
Теперь собственно один лист

X++:
private COM getWorkSheet(anytype _workSheetID)
{
    COM comRet;
    ComVariant  varRet;
    ComDispFunction funcGet;
    COMVariant varArgStr;
    COMVariant varArgInt;
    ;

    if (m_comDocument)
    {
        try
        {
            this.getWorkSheets();
            /*
            comRet = comWorkSheets.item(_workSheetID);
            */
            funcGet = new ComDispFunction(comWorkSheets, "item", COMDispContext::PropertyGet);
            varRet  = new COMVariant(COMVariantInOut::OUT_RETVAL, COMVariantType::VT_DISPATCH);

            switch (typeOf(_workSheetID))
            {
            case types::String :
                        varArgStr = new COMVariant(COMVariantInOut::In, COMVariantType::VT_BSTR);
                        varArgStr.bStr(_workSheetID);
                        funcGet.call(varArgStr, varRet);
                        break;
        
            case types::Integer :
                        varArgInt = new COMVariant(COMVariantInOut::In, COMVariantType::VT_INT);
                        varArgInt.int(_workSheetID);
                        funcGet.call(varArgInt, varRet);
                        break;

            default :
                        throw error('Не корректный тип параметра');
                        break;
            }   // switch (typeOf(_workSheetID))
    
            comRet = COM::createFromInterface(varRet.iDispatch());

        }

        catch (Exception::Error)
        {
            throw error("@GEE6043");
        }
    }

    return comRet;
}
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: AlGol (2), NeveB (1), Logger (7), Ace of Database (5), ena_ax (1), Sergey Petrov (1), at5454 (1).