Russian Qt Forum
Ноябрь 23, 2024, 00:52 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как вставить разрыв страници в Excel  (Прочитано 7575 раз)
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?
Может кто сталкивался с подобной проблемой? Буду очень признателен!
Записан
BRE
Гость
« Ответ #1 : Ноябрь 03, 2010, 19:25 »

Посмотри на:
QVariant QAxBase::asVariant () const
Записан
Wlad_C
Гость
« Ответ #2 : Ноябрь 03, 2010, 20:07 »

Цитировать
QVariant QAxBase::asVariant () const
- Не то. Я уже имею активную ячейку c типом QAxObject.
Теперь ее нужно подставить в качестве параметра в функцию
    querySubObject("Add(IDispatch*)", ActiveCells)
Но функция требует приведение
   (IDispatch*) ActiveCells
что сделать не получается.
Может есть какие - нибудь обходные пути?
Записан
BRE
Гость
« Ответ #3 : Ноябрь 03, 2010, 20:08 »

Код
C++ (Qt)
   querySubObject("Add(IDispatch*)", ActiveCells.asVariant() );
 
Записан
Wlad_C
Гость
« Ответ #4 : Ноябрь 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());
Большое спасибо!!!
Этот код работает!
Записан
Wlad_C
Гость
« Ответ #5 : Ноябрь 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() была написана давно, и с тех пор не модифицировалась.

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.069 секунд. Запросов: 20.