02.12.2003, 20:02 | #1 |
Участник
|
COM и работа с шаблонами Excel
дописываю обертку COM для Excel (SysExcel и его потомки не включают всю необходимую функциональность):
COM COMApplication COM COMSheets COM COMSheetSRC, COM COMSheetDST COM COMRangeSRC; COM COMRangeDST; COM COMRangeRows COM COMRangeCols COM COMRangeRowCount; COM COMRangeColCount; ComVariant a; COMapplication=excel.comObject(); //это родной, из SysExcel COMSheets=COMApplication.Worksheets(); COMSheetSRC=COMSheets.Item(2); COMSheetDST=COMSheets.Item(1); COMrangeSRC=COMSheetSRC.Usedrange(); COMrangeDST=COMSheetDST.Usedrange(); COMrangeRows=COMrangeDST.Rows(); COMrangeCols=COMrangeDST.Columns(); COMrangeColCount=COMRangeCols.Count(); a=COMVariant::createFromCOM(COMRangeColCount); Компилятор молчит,а уже при вызове метода инициализировать A не удается, сообщение об ошибке: Неправильные типы аргументов в операции присвоения значения. Что не в порядке? дальше должно быть вот что: a.int(-a.int()+1); COMRangeDST=COMRangeDST.Offset(COMRangeRows.Count(), a); но не уверен, что и тут не будет ошибки приведения типов как правильно получить значение из свойства COM-объекта, привести его к какому-нибудь типу (int или строка, например), проделать над ним операции и затем снова передать в качестве параметра методу COM-объекта? |
|
03.12.2003, 15:39 | #2 |
Участник
|
IMHO COMRangeCols.Count() вернет int, а не COM. В этом все дело. А компилятор и будет молчать, поскольку Axapta использует позднее связывание. Так же можно воспользоваться мастером оболочек для COM объектов в Axapta (сервис->средства разработки->мастера) и посмотреть какой код предложит тебе система.
По поводу приведения типов: в axapta нет операций приведения типа. Если из одного типа нужно получить дугой - используй функции типа any2int, int2str и т.д. / VARIANT в automation и Axapta COMVariant - разные вещи и по-разному работают. Например, попробуй сл. job: static void Job1(Args _args) { COMVariant c = COMVariant::createFromInt(1); print c.bStr(); pause; } Это нормальная работа для automation, но в Axapta это не так. Axapta ненапечатает ничего. |
|
03.12.2003, 15:47 | #3 |
Участник
|
Цитата:
IMHO COMRangeCols.Count() вернет int, а не COM. В этом все дело. А компилятор и будет молчать, поскольку Axapta использует позднее связывание. Так же можно воспользоваться мастером оболочек для COM объектов в Axapta (сервис->средства разработки->мастера) и посмотреть какой код предложит тебе система.
COMRangeDST=COMRangeDST.Offset(COMRangeRows.Count(),1-COMRangeCols.Count()); но Axapta вернула сообщение об ошибке приведения типов |
|
03.12.2003, 16:04 | #4 |
Участник
|
Попробуй вот так
COMVariant c = COMVariant::createFromCOM(.... и посмотри что упадет в с. |
|
03.12.2003, 16:08 | #5 |
Участник
|
тот же результат
|
|
03.12.2003, 16:15 | #6 |
Участник
|
Извини за пред. post ты делал то же самое выше... Что скажет такой код?
COMRangeDST=COMRangeDST.Offset(COMVariant::createFromInt(COMRangeRows.Count()),ComVariont::createFromInt(1-COMRangeCols.Count())); |
|
04.12.2003, 16:58 | #7 |
Участник
|
мы делаем что-то не то
это тоже не сработало |
|