C++Builder6 и Word
#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?
У меня(чтобы не делал) открывается Word97, хотя есть и Word2000. Как запустить Word2000?
Если принять за факт, что шестая версия Word (еще под Windows 3.x) - шестая, то соответственно Word 95 - седьмая, Word 97 - восьмая, Word 2000 - девятая, и т. д.
Соответственно, в системе может быть установлено несколько версий Word одновременно. При этом класс "Word.Application" - приложение Word по умолчанию, "Word.Application.8" - восьмая версия, и т. д.
Если принять за факт, что шестая версия 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"
Самое интересное: на работе вышеуказанный пример, на Builder6 в нем установлены компоненты Word2k
Слушай, причем тут компоненты, и причем варианты? Если я правильно понимаю, приведенный код на фиг не использует компоненты, а работает через интерфейсы IDispatch, предоставляемые вариантами.
Если строка
не заработает, можешь идти пить или искать ошибку в ДНК.
Слушай, причем тут компоненты, и причем варианты? Если я правильно понимаю, приведенный код на фиг не использует компоненты, а работает через интерфейсы IDispatch, предоставляемые вариантами.
Если строка
не заработает, можешь идти пить или искать ошибку в ДНК.
Создал три экзешника в которых в вышеуказанной строке стоит соответственно:
Word.Application
Word.Application.8
Word.Application.9
Испробовал на 5 компах с разными версиями Word.
Результат один:
Ошибка
Неверная строка с указанием класса.
На компе где стоит Builder все три экзешника запускаются нормально, вне зависимости от изменений
в строке, но запускают только Word97.
Нашел!!
На форме болтался безхозный WordApplication, убрал его,строку переписал как "Variant WD=CreateOleObject("Word.Application")
Работает со всеми версиями Word.
ДНК править не пришлось :)
Последний вопрос.
Как через интерфейс IDispatch работать с таблицами в Word (добавлять-удалять строки,заносить данные из таблиц базы)
Если можно пример :)
Как через интерфейс IDispatch работать с таблицами в Word (добавлять-удалять строки,заносить данные из таблиц базы)
Если можно пример :)
Посмотри, как это делает Word.
На форме болтался безхозный WordApplication, убрал его
К слову сказать, компоненты с закладки Servers используют vtable-интерфейс, поэтому должны работать быстрее IDispatch. Особенно это будет заметно на больших объемах данных.
IDispatch вообще самый медленный способ доступа к интерфейсам - в нем адрес процедуры или свойства каждый раз ищется по имени.
Посмотри, как это делает Word.
Можешь еще посмотреть исходник Word.pas (или как он там называется). В нем можно просто по имени найти свойства или интерфейсы, работающие с таблицами и подсмотреть их синтаксис.
Как через интерфейс IDispatch работать с таблицами в Word (добавлять-удалять строки,заносить данные из таблиц базы)
Если можно пример :)
//обрати внимание на порядок подключения хедеров!
#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");
}
Собирал на машине с Win98 + Word97(Application8), а сейчас запустил на Win2000 + Word2000(Application9) - пашет(наверно "глюки" Билдера ).:)
Большое СПАСИБО GIZMO за пример!!!!!
То, что доктор прописал.
P.s
при сохранении документа выдавалась ошибка:
"Неправильный тип переменной".
Переписал строку:
Document.OleProcedure("SaveAs",WideString(ChangeFileExt(Application->ExeName, ".doc")));
Все пошло.