Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

C++Builder6 и Word

6.2K
28 декабря 2004 года
sklutov
20 / / 24.12.2004
На основании примера от moonmike и собственных мучений родилось вот что:

#include <vcl.h>
#pragma hdrstop
#include <word_2k.h>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "Word_2K_SRVR"
#pragma resource "*.dfm"
TForm1 *Form1;
Variant XL, WD, WDoc, WS;
//---------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
Variant WD=CreateOleObject("Word.Application.8");
WD.OlePropertySet("Visible",true);
WD.OlePropertySet("Caption","Отчет");//Задание заголовка для окна Word
WD.OlePropertyGet("Documents").OleProcedure("Open","C:\\Шаблон.doc");
WDoc = WD.OlePropertyGet("ActiveDocument");
Variant EmptyParam;
Variant ReplaceType = wdReplaceAll;
WDoc.OleFunction("Range").OlePropertyGet("Find").OleProcedure("Execute", StringToOleStr("%Регион%"), EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, StringToOleStr("1111111"), ReplaceType);
WDoc.OleFunction("Range").OlePropertyGet("Find").OleProcedure("Execute", StringToOleStr("%Имяр%"), EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, StringToOleStr("Горохову"), ReplaceType);
WDoc.OleFunction("Range").OlePropertyGet("Find").OleProcedure("Execute", StringToOleStr("%ИО%"), EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, StringToOleStr("Горохов"), ReplaceType);

AnsiString ThisName ="331";
WDoc.OleProcedure("SaveAs", StringToOleStr(ThisName));
WDoc.OleFunction("Close");
WDoc.Clear();
WD.OleFunction("Quit");

может кто добавит работу с таблицами.
У меня(чтобы не делал) открывается Word97, хотя есть и Word2000. Как запустить Word2000?
10
28 декабря 2004 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by sklutov
У меня(чтобы не делал) открывается Word97, хотя есть и Word2000. Как запустить Word2000?


Если принять за факт, что шестая версия Word (еще под Windows 3.x) - шестая, то соответственно Word 95 - седьмая, Word 97 - восьмая, Word 2000 - девятая, и т. д.

Соответственно, в системе может быть установлено несколько версий Word одновременно. При этом класс "Word.Application" - приложение Word по умолчанию, "Word.Application.8" - восьмая версия, и т. д.

6.2K
29 декабря 2004 года
sklutov
20 / / 24.12.2004
Цитата:
Originally posted by smartsoft

Если принять за факт, что шестая версия Word (еще под Windows 3.x) - шестая, то соответственно Word 95 - седьмая, Word 97 - восьмая, Word 2000 - девятая, и т. д.

Соответственно, в системе может быть установлено несколько версий Word одновременно. При этом класс "Word.Application" - приложение Word по умолчанию, "Word.Application.8" - восьмая версия, и т. д.





Все уже перепробывал.
Самое интересное: на работе вышеуказанный пример, на Builder6 в нем установлены компоненты Word2k,
работает нормально. Дома-Builder6, компоненты Word97 не работает.
Компилируется нормально, затем при клике на Button1 выдает ошибку на строку
WD.OlePropertySet("Visible",true);
---------------------------
Debugger Exception Notification
---------------------------
Project Project2.exe raised exception class EAccessViolation with message 'Access violation at address 0047A23B in module 'PROJECT2.EXE'. Read of address FFFFFFFF'.

в sysvari.h останавливается на строке:
OlePropertySet(name, static_cast<TAutoArgsBase&>(args));

#include <word_2k.h>
#pragma link "Word_2K_SRVR" менял на "word97"

10
29 декабря 2004 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by sklutov
Самое интересное: на работе вышеуказанный пример, на Builder6 в нем установлены компоненты Word2k


Слушай, причем тут компоненты, и причем варианты? Если я правильно понимаю, приведенный код на фиг не использует компоненты, а работает через интерфейсы IDispatch, предоставляемые вариантами.

Если строка

 
Код:
Variant WD=CreateOleObject("Word.Application.9");

не заработает, можешь идти пить или искать ошибку в ДНК.
6.2K
29 декабря 2004 года
sklutov
20 / / 24.12.2004
Цитата:
Originally posted by smartsoft

Слушай, причем тут компоненты, и причем варианты? Если я правильно понимаю, приведенный код на фиг не использует компоненты, а работает через интерфейсы IDispatch, предоставляемые вариантами.

Если строка
 
Код:
Variant WD=CreateOleObject("Word.Application.9");

не заработает, можешь идти пить или искать ошибку в ДНК.




Создал три экзешника в которых в вышеуказанной строке стоит соответственно:
Word.Application
Word.Application.8
Word.Application.9

Испробовал на 5 компах с разными версиями Word.
Результат один:
Ошибка
Неверная строка с указанием класса.

На компе где стоит Builder все три экзешника запускаются нормально, вне зависимости от изменений
в строке, но запускают только Word97.

Нашел!!
На форме болтался безхозный WordApplication, убрал его,строку переписал как "Variant WD=CreateOleObject("Word.Application")
Работает со всеми версиями Word.

ДНК править не пришлось :)

Последний вопрос.
Как через интерфейс IDispatch работать с таблицами в Word (добавлять-удалять строки,заносить данные из таблиц базы)
Если можно пример :)

247
29 декабря 2004 года
wanja
1.2K / / 03.02.2003
Цитата:
Originally posted by sklutov

Как через интерфейс IDispatch работать с таблицами в Word (добавлять-удалять строки,заносить данные из таблиц базы)
Если можно пример :)


Посмотри, как это делает Word.

10
29 декабря 2004 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by sklutov

На форме болтался безхозный WordApplication, убрал его


К слову сказать, компоненты с закладки Servers используют vtable-интерфейс, поэтому должны работать быстрее IDispatch. Особенно это будет заметно на больших объемах данных.

IDispatch вообще самый медленный способ доступа к интерфейсам - в нем адрес процедуры или свойства каждый раз ищется по имени.

10
29 декабря 2004 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by wanja
Посмотри, как это делает Word.


Можешь еще посмотреть исходник Word.pas (или как он там называется). В нем можно просто по имени найти свойства или интерфейсы, работающие с таблицами и подсмотреть их синтаксис.

246
29 декабря 2004 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by sklutov

Как через интерфейс IDispatch работать с таблицами в Word (добавлять-удалять строки,заносить данные из таблиц базы)
Если можно пример :)


Код:
#include <vcl.h>
//обрати внимание на порядок подключения хедеров!
#include <utilcls.h>  
#include <sysvari.h>
#include <ComObj.hpp>

#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    Variant Word, Document, Table, Cell;
    int RowCount, ColCount;

    Word = CreateOleObject("Word.Application.8");
    Word.OlePropertySet("Visible", true);
    Word.OlePropertyGet("Documents").OleProcedure("Add");
    Document = Word.OlePropertyGet("Documents").OleFunction("Item", 1);
    Table = Document.OlePropertyGet("Tables").OleFunction("Add", Document.OleFunction("Range", 0, 0), 5, 5);
    RowCount = Table.OlePropertyGet("Rows").OlePropertyGet("Count");
    ColCount = Table.OlePropertyGet("Columns").OlePropertyGet("Count");
    for (int i=1; i <=RowCount; i++)
       for(int j=1; j <=ColCount; j++) {
        Cell = Table.OleFunction("Cell", i, j);
        Cell.OlePropertyGet("Range").OleProcedure("InsertAfter", WideString(IntToStr(i)) + WideString("-") + WideString(IntToStr(j)));
    }
    Document.OleProcedure("SaveAs", ChangeFileExt(Application->ExeName, ".doc"));
    Word.OleProcedure("Quit");
}
246
29 декабря 2004 года
GIZMO
1.8K / / 30.07.2004
Собирал на машине с Win98 + Word97(Application8), а сейчас запустил на Win2000 + Word2000(Application9) - пашет(наверно "глюки" Билдера ).:)
6.2K
29 декабря 2004 года
sklutov
20 / / 24.12.2004
Цитата:
Originally posted by GIZMO
Собирал на машине с Win98 + Word97(Application8), а сейчас запустил на Win2000 + Word2000(Application9) - пашет(наверно "глюки" Билдера ).:)




Большое СПАСИБО GIZMO за пример!!!!!
То, что доктор прописал.

P.s

при сохранении документа выдавалась ошибка:
"Неправильный тип переменной".

Переписал строку:
Document.OleProcedure("SaveAs",WideString(ChangeFileExt(Application->ExeName, ".doc")));

Все пошло.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог