Russian Qt Forum

Qt => ActiveX => Тема начата: Wlad_C от Ноябрь 03, 2010, 18:22



Название: Как вставить разрыв страници в Excel
Отправлено: Wlad_C от Ноябрь 03, 2010, 18:22
Добрый вечер!
Записал макрос вставки разрыва страницы в Excel, получил:
       ActiveWindow.SelectedSheets.HPageBreaks.Add Before:=ActiveCell
В программе из активной страницы получаем HPageBreaks :
       QAxObject * hPageBreaks = Sheets->querySubObject("HPageBreaks");
Используя функцию
      hPageBreaks->generateDocumentation();
получаем получаем документацию в формате html на HPageBreaks, и видим такие строчки для нужной нам функции Add:
     QVariantList params = ...
     QAxObject * result = object->querySubObject("Add(IDispatch*)", params);
Вот здесь и возникает проблема!
Для вставки разрыва нужно передать в качестве параметра активную ячейку в виде указателя  на IDispatch! Получить активную ячейку как QAxObject не сложно. А вот как из QAxObject получить указатель на IDispatch?
Может кто сталкивался с подобной проблемой? Буду очень признателен!


Название: Re: Как вставить разрыв страници в Excel
Отправлено: BRE от Ноябрь 03, 2010, 19:25
Посмотри на:
QVariant QAxBase::asVariant () const


Название: Re: Как вставить разрыв страници в Excel
Отправлено: Wlad_C от Ноябрь 03, 2010, 20:07
Цитировать
QVariant QAxBase::asVariant () const
- Не то. Я уже имею активную ячейку c типом QAxObject.
Теперь ее нужно подставить в качестве параметра в функцию
    querySubObject("Add(IDispatch*)", ActiveCells)
Но функция требует приведение
   (IDispatch*) ActiveCells
что сделать не получается.
Может есть какие - нибудь обходные пути?


Название: Re: Как вставить разрыв страници в Excel
Отправлено: BRE от Ноябрь 03, 2010, 20:08
Код
C++ (Qt)
   querySubObject("Add(IDispatch*)", ActiveCells.asVariant() );
 


Название: Re: Как вставить разрыв страници в Excel
Отправлено: Wlad_C от Ноябрь 03, 2010, 20:51
Вы оказались правы! Это я не догнал.
Я активную ячейку получал так:
   QVariant ActiveCell = App->property("ActiveCell");
А надо было так:
Код:
    QAxObject * Sheets = Workbook->querySubObject( "Sheets" ); 
    hPageBreaks = Sheets->querySubObject("HPageBreaks");
    QString strInsert ="A10";                                       // Ставим разрыв выше 10 строки, для примера
    Range = Sheet->querySubObject( "Range(const QVariant&)",strInsert);
    Range->dynamicCall("Select()");
    hPageBreaks->querySubObject("Add(IDispatch*)",Range->asVariant());
Большое спасибо!!!
Этот код работает!


Название: Re: Как вставить разрыв страници в Excel
Отправлено: Wlad_C от Ноябрь 03, 2010, 21:24
P.S.
В Qt придумана неплохая функция:
   generateDocumentation()
Но верить тому, что там написано надо с большой оглядкой.
Например, для интерфейса _Application она выдает:
   IDispatch* val = object->property("ActiveCell").toIDispatch*();
Хотя на самом деле мы получаем тип QVariant. Т.е. правильная запись должна быть такая:
   QVariant val = object->property("ActiveCell");
А для интерфейса HPageBreaks:
   QVariantList params = ...
   QAxObject * result = object->querySubObject("Add(IDispatch*)", params);
Т.е. в params надо поместить (IDispatch*).
Вот и возникает путаница. Видимо функция generateDocumentation() была написана давно, и с тех пор не модифицировалась.