Russian Qt Forum

Qt => ActiveX => Тема начата: admsasha от Октябрь 15, 2009, 09:54



Название: "поиск и замена" в word
Отправлено: 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");


Название: Re: "поиск и замена" в word
Отправлено: CroCIV от Октябрь 15, 2009, 10:34
вотэдак http://wiki.crossplatform.ru/index.php/Работе_с_MS_Office_с_помощью_ActiveQt (http://wiki.crossplatform.ru/index.php/Работе_с_MS_Office_с_помощью_ActiveQt)
если тут чего-то нет, то лезешь в справку по MS VB Word или чего там тебе надо, находишь интересующие тебя классы свойства и методы, разбираешься с ними и добавляешь в эту же статью


Название: Re: "поиск и замена" в word
Отправлено: admsasha от Октябрь 15, 2009, 10:45
вотэдак http://wiki.crossplatform.ru/index.php/Работе_с_MS_Office_с_помощью_ActiveQt (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 я не могу сообразить   ???  :-\


Название: Re: "поиск и замена" в word
Отправлено: CroCIV от Октябрь 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"));
...


Название: Re: "поиск и замена" в word
Отправлено: admsasha от Октябрь 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]


Название: Re: "поиск и замена" в word
Отправлено: CroCIV от Октябрь 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() ...


Название: Re: "поиск и замена" в word
Отправлено: admsasha от Октябрь 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'
Вот с этим не понял, что ему надо...


Название: Re: "поиск и замена" в word
Отправлено: CroCIV от Октябрь 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