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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: "поиск и замена" в word  (Прочитано 11174 раз)
admsasha
Гость
« : Октябрь 15, 2009, 09:54 »

А как в открытом документе сделать "поиск и замена"

открыл, например test.doc, а дальше ?

    QAxObject word("Word.Application");
    word.setProperty("Visible", true);
    word.dynamicCall("Activate()");
    word.querySubObject("Documents")->querySubObject("Open(QVariant)", "c:\\test.doc");
Записан
CroCIV
Гость
« Ответ #1 : Октябрь 15, 2009, 10:34 »

вотэдак http://wiki.crossplatform.ru/index.php/Работе_с_MS_Office_с_помощью_ActiveQt
если тут чего-то нет, то лезешь в справку по MS VB Word или чего там тебе надо, находишь интересующие тебя классы свойства и методы, разбираешься с ними и добавляешь в эту же статью
Записан
admsasha
Гость
« Ответ #2 : Октябрь 15, 2009, 10:45 »

вотэдак http://wiki.crossplatform.ru/index.php/Работе_с_MS_Office_с_помощью_ActiveQt
если тут чего-то нет, то лезешь в справку по MS VB Word или чего там тебе надо, находишь интересующие тебя классы свойства и методы, разбираешься с ними и добавляешь в эту же статью
Да, её я читал, там про excel и нужного нет.

В VBA это выглядит так

Код:
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "OldText"
        .Replacement.Text = "NewText"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll


как перевести на ActiveQt я не могу сообразить   Непонимающий  В замешательстве
Записан
CroCIV
Гость
« Ответ #3 : Октябрь 15, 2009, 12:51 »

какнибудьэдак:
Код:
...
QAxObject *selection=...->querySubObject(...);
QAxObject *find = selection->querySubObject("Find");
QAxObject *replasment = find->querySubObject("Replasement");
replasment = selection->querySubObject("ClearFormatting");
find->dynamicCall(".Text = \"const QVariant&\"",QVariant("OldText"));
...
Записан
admsasha
Гость
« Ответ #4 : Октябрь 16, 2009, 04:59 »

какнибудьэдак:
Код:
...
QAxObject *selection=...->querySubObject(...);
QAxObject *find = selection->querySubObject("Find");
QAxObject *replasment = find->querySubObject("Replasement");
replasment = selection->querySubObject("ClearFormatting");
find->dynamicCall(".Text = \"const QVariant&\"",QVariant("OldText"));
...

Цитировать
QAxBase::dynamicCallHelper: Find: No such property in  [unknown]
Записан
CroCIV
Гость
« Ответ #5 : Октябрь 16, 2009, 08:40 »

Selection - обьект класса Application
Find - бьект класса Selection
ссно чтобы получить указатель на Find, надо сделать что-то подобное

Код:
	QAxObject * word = new QAxWidget("Word.Application");
word->setProperty("DisplayAlerts", "0");
word->setProperty("Visible", true);
if (word) //у нас есть не нулевой указатель, это значит приложение такое установлено и мы к нему достучались
QAxObject *selection = word->querySubObject( "Selection" );
if (selection) //это значит мы успешно получили указатель на обьект Selection
QAxObject *find = selection->querySubObject( "Find" );
if (find) //это значит мы успешно получили указатель на обьект Find
...
если что-то не работает, или возвращает нулевой указатель или валится с ошибкой, то тут нужно включить логическое мышление, например можно заметить что у нас не открыт и не создан ни один документ и т.д.

QtActiveX - это не самостоятельный язык, а всего-лишь обертка, позволяющая получить доступ к обьектам COM, там все обращения такие же, как и в VB, только через querySubObject() и dynamicCall() ...
« Последнее редактирование: Октябрь 16, 2009, 09:06 от CroCIV » Записан
admsasha
Гость
« Ответ #6 : Октябрь 22, 2009, 02:26 »

Цитировать
C:/msys/1.0/home/test/form1.cpp:18: error: cannot convert `QAxWidget*' to `QAxObject*' in initialization
наверное, должно быть так ?
Код:
QAxObject * word = new QAxObject("Word.Application");

Цитировать
C:/msys/1.0/home/test/form1.cpp:26: error: `selection' was not declared in this scope
QAxObject *selection объявить в .h ?

Цитировать
C:/msys/1.0/home/test/form1.cpp:29: warning: the address of `static QWidget* QWidget::find(HWND__*)', will always evaluate as `true'
Вот с этим не понял, что ему надо...
Записан
CroCIV
Гость
« Ответ #7 : Октябрь 22, 2009, 08:22 »

наверное, должно быть так ?
Код:
QAxObject * word = new QAxObject("Word.Application");
да у меня там очепятка

Цитировать
C:/msys/1.0/home/test/form1.cpp:26: error: `selection' was not declared in this scope
QAxObject *selection объявить в .h ?
если тебе этот указатель хранить не надо, то зачем тебе класс мусором нагружать? так-то ваще все равно где ты ее обьявляешь.

Цитировать
C:/msys/1.0/home/test/form1.cpp:29: warning: the address of `static QWidget* QWidget::find(HWND__*)', will always evaluate as `true'
Вот с этим не понял, что ему надо...
а вот это вообще какая-то невменяемость говорит о том, что у тебя что-то там не то и не так, вылажи ка исходнички свои .h и .cpp
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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