Показать сообщение отдельно
Старый 20.01.2004, 12:53   #20  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 646 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Немного покопался... Да, по человечески (без программирования) сделать это нельзя. Но, можно немного доработать напильником.

Немного теории для начала. В интерфейсах Excel есть два метода для выбора Range: один в интерфейсе Worksheet (range выбирается в контексте листа книги Excel), другой в интерфейсе Application (range можно выбирать вообще как угодно, хоть из другого файла). Так вот, в документообороте Axapta используется первый метод, но приложив минимум усилий можно заставить его использовать второй.

Во-первых, надо написать обертку для второго метода. В класс SysExcelApplication добавьте абстрактный метод range:
Код:
abstract public SysExcelRange range(str _rangeName = '')
{
}
В расширяющие его классы тоже добавьте этот метод. В SysExcelApplication_2000:
Код:
public SysExcelRange range(str _rangeName = "")
{
    return SysExcelRange::construct(MSOfficeVersion::Office2000,
                                    _rangeName ? 
                                        application.range(_rangeName) : 
                                        application.range());
}
В SysExcelApplication_XP:
Код:
public SysExcelRange range(str _rangeName = "")
{
    return SysExcelRange::construct(MSOfficeVersion::OfficeXP,
                                    _rangeName ? 
                                        application.range(_rangeName) : 
                                        application.range());
}
Теперь завершающий штрих. Нужно заставить класс DocuActionCOM_Excel использовать правильный метод выбора range. Для этого в методе gotoBookmark исправьте
Код:
sysExcelRange = sysExcelWorksheet.range(bookmark);
на
Код:
sysExcelRange = sysExcelApplication.range(bookmark);
В принципе, это все, но есть один маленький нюанс: можно выделять только range, который расположен на активном листе. Выделение range осуществляется методом range.select, поэтому лучше избавиться от его вызовов. Если Вы исправляли метод mainInsertField так, как я рекомендовал в одном из предыдущих постов, то там как раз есть вызов range.select и его следует убрать. Еще один вызов range.select есть в методе insertHardLineBreak. Его тоже лучше убрать.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me