|
![]() |
#1 |
Участник
|
Вы бы сделали хотя бы поиск по данному форуму по ключевому слову "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). |
![]() |
#2 |
Участник
|
По такому принципу пытаюсь переделать форматирование шрифта в ячейке, который был написан так:
X++: void bold(MSOfficeBookMark_RU _bookMark, int _workSheet = 1) { Com MultiRange; Com ComApplication; Com Font; ; if (m_comDocument) { comApplication = m_comDocument.application(); if (comApplication) { MultiRange = this.findRange(_bookMark, _workSheet); Font = MultiRange.Font(); Font.Bold(1); } } } При написании такой конструкции X++: funcGet = new ComDispFunction(Font, "Bold", COMDispContext::PropertyGet); varRet = new COMVariant(COMVariantInOut::OUT_RETVAL, COMVariantType::VT_DISPATCH); varArgInt = new COMVariant(COMVariantInOut::In, COMVariantType::VT_INT); varArgInt.int(1); funcGet.call(varArgInt); //-------------- //Font.Bold(1); -------------------- Метод "Bold" в COM-объекте класса "Font" возвратил код ошибки 0x8002000E (DISP_E_BADPARAMCOUNT), который означает: Число аргументов, указанных в вызове функции, отличается от числа аргументов в объявлении метода. -------------------- При вызове без аргументов funcGet.call(); работает отлично. Каким образом сделать шрифт болдом?
__________________
Ален ноби, ностра алис. Что означает - если один человек построил, другой завсегда разобрать может. |
|
|
За это сообщение автора поблагодарили: NeveB (1). |
![]() |
#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; } Коллеги, данный изменение методов решило проблему timeout при работе отчетов модуля "Генератор Российских отчетов". см мою ссылку по теме Axapta 2009. str2IntOk Есть два вопроса: 1. На сколько это решение является универсальным? Какие могут быть исключения? 2. Почему данный подход не реализован в стандартном функционале? |
|
Теги |
com-объект, comdispfunction, excel, excel com формат, законченный пример, полезное |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|