Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.06;
Скачать: CL | DM;

Вниз

Отчет в MS Word   Найти похожие ветки 

 
Tornado ©   (2004-01-22 10:17) [0]

Есть программа котороя подготавливает отчет в MS Word из базы данных. Программа написана на Delphi 7, для формирования отчета используется компонент WordApplication. Сам шаблон отчета был создан в MS Word 2000. После установки (setup сделан при помощи InstallShield Dev) на компьютер где установлен MS Offise 97 и попытке построить отчет выдается ошибка <Access violation in module OLEAUT.DLL>. Я так понимаю это из-за разных версий офиса где был создан шаблон и где пытаются его открыть? Как можно это побороть? Пытался брать библиотеку OLEAUT.DLL со своего компа (где установлен Office 2000) и копировать на комп где происходит ошибка - никаких изменений. Подскажите пожалуйста варианты решений. Спасибо.


 
Tornado ©   (2004-01-22 10:19) [1]

да, очепятка небольшая, библиотека называеется OLEAUT32.DLL конечно и входит в набор Microsoft OLE 2.4


 
Плохиш_   (2004-01-22 10:29) [2]

Совместимость поддерживается только снизу вверх, так что делай отчёт в оффисе 97. Это касается не только МС


 
jack128 ©   (2004-01-22 10:59) [3]

Используй OleVariant, кажись это называется познее связование, тогда проблем с версиями не будет

var
MsWord,
Doc: OleVarinant;
begin
MsWord := CreateOleObject("Word.Application");
Doc := MsWord.Documents.Add;
...
end;


 
Плохиш_   (2004-01-22 11:00) [4]

>jack128 © (22.01.04 10:59) [3]

Что и шаблон откроет?


 
jack128 ©   (2004-01-22 11:06) [5]


> Плохиш_ (22.01.04 11:00) [4]
Смотря какой. Не всякий шаблон, созданный в 2000 ворде НЕ откроется в 97ом ;-)


 
Плохиш_   (2004-01-22 11:08) [6]

>jack128 © (22.01.04 11:06) [5]

Вопрос читал? Его как раз и не открывается ;-)


 
jack128 ©   (2004-01-22 11:10) [7]

Это я понял :-) Я лишь хотел указать, что вовсе не обязательно переходить на 97 офис. Все можно сделать и 2000, и даже 2002


 
jack128 ©   (2004-01-22 11:12) [8]

А вот если использовать библиотеки типов из под 2000 офиса, то весьма вероятно прога не будет работать даже если шаблон работает нормально


 
Плохиш_   (2004-01-22 11:16) [9]


> jack128 © (22.01.04 11:12) [8]
> А вот если использовать библиотеки типов из под 2000 офиса,
> то весьма вероятно прога не будет работать даже если шаблон
> работает нормально

Я думаю, что детский сад с копированием библиотек откуда-попало куда-попало вообще можно серьёзно не рассматривать. Над такими экспериментаторами можно только по-издеваться ;-)

Как бы нас модератор не наказал ;-)


 
Tornado ©   (2004-01-22 11:21) [10]

спасибо за ответы, т.е. мои действия такие: создаю на компе с 97-м офисом шаблон, потом копирую его к себе на комп, пишу как сказал jack128 © (22.01.04 10:59) [3] насчет OleVariant и в принципе такой отчет должен работать и на моем компе с офис2000 и на чужом с офис97? Я правильно понял? Спасибо еще раз за ответы


 
jack128 ©   (2004-01-22 11:29) [11]


> Tornado © (22.01.04 11:21) [10]
Для начала нужно выяснить в чем причина проблемы. У тебя сам word97 открывает шаблон? Если нет, то создать _такой же_ отчет в 97ом ты врятли сможешь, потому что используешь фичи 97ому не досткпные. Если же проблема именно в Ole, то достаточно использовать познее связование(OleVariant"ы), имхо. Покрайней мере я так делал отчеты в 2002, и они спокойно работали в 2000


 
Tornado ©   (2004-01-22 11:37) [12]

> jack128 © (22.01.04 11:29) [11]

если просто открыть шаблон в 97-м кликнув по нему мышкой - открывается на ура с сохранением все закладок, оформления и проч. Т.е. мне именно в проге достаточно использовать OleVariant в проге и делать отчет как и прежде в 2000-м офисе?


 
jack128 ©   (2004-01-22 11:42) [13]

Да


 
jack128 ©   (2004-01-22 11:44) [14]

А воодще, у тя ж D7. Посмотри у себя в uses. Там Word97 или Word2000 написано?


 
mtb   (2004-01-22 12:20) [15]

в 97 или 2000 или ХР
кол-во передаваемых в WORD параметров одинаково?


 
Tornado ©   (2004-01-22 12:24) [16]

в uses написано Word2000


 
mtb   (2004-01-22 12:38) [17]

D7 при установке запрашивает какой офис будем юзать
если ответили 2000, то все компоненты офиса из Servers
будут работать только с 2000,
если у всех клиентов 97 необходимо использовать его и программеру
иначе не получится
т.к. кол-во параметров передаваемое в офис разное
чтобы наглядно увидеть запиши макрос в ворде 97 и 2000 на сохранение документа и убедись.
почему спроси Билли


 
Tornado ©   (2004-01-22 12:45) [18]

mtb (22.01.04 12:38) [17]

круто...и как быть тогда? переустанавливать дельфи? или заставить всех юзеров поставить 2000-й офис? Да и не факт что у ВСЕХ будет 97-й, у некоторых 2000-й...меня порвут за такую "прогу"... Щас попробую вариант jack128 ©, мож чего получится.


 
mtb   (2004-01-22 12:56) [19]

>Щас попробую вариант jack128 ©,
И правильно! если ты имеешь ввиду
MsWord := CreateOleObject("Word.Application");

Но сразу в самом начале определи какая версия ворда стоит у клиента а далее работаешь через if or case
для обкатки поставь у себя два офиса


 
Tornado ©   (2004-01-22 13:00) [20]

не подскажешь как определить версию ворда, есть какая-нить функция? спасибо!


 
mtb   (2004-01-22 13:22) [21]

если сработает
MsWord := CreateOleObject("Word.Application");
то кажется
MsWord.version


 
jack128 ©   (2004-01-22 13:31) [22]


> Но сразу в самом начале определи какая версия ворда стоит
> у клиента а далее работаешь через if or case
> для обкатки поставь у себя два офиса
Нафиг? какая разница сколько параметров у метода? При познем связование это не имеет значения. Лишбы лишних не передал. ;-)

Доступен такой синтаксис
MsWord := CreateOleObject(...);
MsWord.SomeMethod(ParamName1 := ParamValue1, ParamName2 := ParamValue2);


 
mtb   (2004-01-22 13:43) [23]

Лучше создать отдельный модуль для работы с вордомм
и там прописать все функции и процедуры работы с ним
типа

function find(findtxt:olevariant):boolean;
var
a,b,c:olevariant;
begin
try
wordapp.wapp.WA.Selection.Find.ClearFormatting;
c:= wdFindContinue;
a:=true;
b:=false;
result:=wordapp.wapp.WA.Selection.Find.Execute(findtxt,a,b,b,b,b,a,c,a,EmptyParam,EmptyParam,EmptyParam,EmptyParam,Empty Param,EmptyParam);
except
showmessage("No save vopros!!!");
result:=false;
end;
end;


это для ХР немного кривовато писалось для одного отчета
но для поиска в документе текста достаточно вызвать функцию

find("ищу");

мона кон-но полностью расписать но если искать приходится часто
потом можно заблудиться


 
Tornado ©   (2004-01-22 13:47) [24]

сделал я так:

var
MsWord,Doc: OLEVariant;

MsWord := CreateOleObject("Word.Application");
Doc := ExtractFilePath(Application.ExeName) + "Report.doc";
MsWord.Documents.Add(InvoiceTemplate, EmptyParam, EmptyParam, EmptyParam);


все проходит без ошибок, но мне надо еще и к определенной закладке переходить в документе и туда данные вставлять. Почему если после переменной MsWord поставить точку то не появляется список параметров? Хде их можно посмотреть? Пытался сделать как с компонентом WordApplication было:

procedure TForm1.Wordgotobookmark(Bookmark: string);
var
What : OLEVariant;
Which : OLEVariant;
Count : OLEVariant;
Name : OLEVariant;
begin
What := wdGotoBookmark;
Which := unAssigned;
Name := Bookmark;
WordApplication.Selection.GoTo_(What, Which, Count, Name);
end;

потом вызывал просто эту процедуру:

Wordgotobookmark("Zakladka");


так теперь не проходит, пишет что нет такого метода у MsWord как GoTo_


 
mtb   (2004-01-22 13:49) [25]

>>Нафиг? какая разница сколько параметров у метода? При познем связование это не имеет значения. Лишбы лишних не передал.

на компе у Tornado стоит 2000 поэтому может и лишнего для 97 передать потому и говорю на 97 писать надежнее :(


 
jack128 ©   (2004-01-22 14:01) [26]


> Почему если после переменной MsWord поставить точку то не
> появляется список параметров?
Гм. Почитай литературу на эту темы. Упращенно говоря компилятор еще не знает какие методы есть у объекта MsWord. Узнать эти методы можно из справки к VisialBasic for Applications. Либо,как сказал mtb, записав макрос. Goto_ - это на самом деле Goto. Просто при импорте библиотеки типов этот метод был переименован, так как goto - зарезервированное слово в паскале.
Еще раз повторю
вот так MsWord.Documents.Add(InvoiceTemplate, EmptyParam, EmptyParam, EmptyParam);
можно не писать. Достаточно написать
MsWord.Documents.Add(InvoiceTemplate); Остальные параметры останутся по умолчанию. Чем меньше параметров передаюшь, тем меньше глюков с версиями будет.

> на компе у Tornado стоит 2000 поэтому может и лишнего для
> 97 передать потому и говорю на 97 писать надежнее :(

Это да, согласен. Просто наврятли у него такой уж сложный отчет, что бы использовать специфичные для Word2000 параметры.


 
mtb   (2004-01-22 14:10) [27]

извиняюсь, забыл с чего начали
действительно что за отчет если еще с закладками
если заранее известно что и куда в шаблоне вставлять
может проще в шаблоне проставить типа @@##&&001,@@##&&002, ... @@##&&003 и.т.д. а потом заменить на нужный текст


 
Tornado ©   (2004-01-22 15:06) [28]

dct сделвсе роде как надо, все работает (у меня на компе), на компе с 97-м опять пишет "Ошибка на сервере"...что может быть?


 
jack128 ©   (2004-01-22 15:10) [29]


> Tornado © (22.01.04 15:06) [28]
код? полний текст ошибки? пиши в лог весь процесс подготовки ошибки и выясни на каком операторе она(ошибка) возникает..


 
jack128 ©   (2004-01-22 15:11) [30]


> пиши в лог весь процесс подготовки ошибки
есстественно процесс подготовки отчета, хотя описка по Фрейду :-)


 
Tornado ©   (2004-01-22 15:20) [31]

код простой до безобразия (для теста):


procedure TForm1.Button1Click(Sender: TObject);
var
InvoiceTemplate : OLEVariant;
begin
MsWord := CreateOleObject("Word.Application");
InvoiceTemplate := ExtractFilePath(Application.ExeName) + "Report.doc";
MsWord.Documents.Add(InvoiceTemplate, EmptyParam, EmptyParam, EmptyParam);
Wordgotobookmark("www");
WordInsertText(DateTimeToStr(Now));
end;

procedure TForm1.Wordgotobookmark(Bookmark: string);
var
What : OLEVariant;
Which : OLEVariant;
Count : OLEVariant;
Name : OLEVariant;
begin
What:=-1;
Which:=unAssigned;
Count:=unAssigned;
Name:=Bookmark;
MsWord.Selection.GoTo(What,Which,Count,Name);
end;

procedure TForm1.WordInsertText(Text: string);
begin
MsWord.Selection.TypeText(Text);
end;


jack128 © я прошу прощения но как записать процесс подготовки отчета в лог? :)

а текст ошибки так и есть: "Ошибка на сервере" и кнопочка ОК...больше ничего


 
jack128 ©   (2004-01-22 15:27) [32]

procedure TForm1.Button1Click(Sender: TObject);
var
InvoiceTemplate : OLEVariant;

> как записать процесс подготовки отчета в лог? :)

begin
MsWord := CreateOleObject("Word.Application");
WriteLn(LogFile, "Создали объект Word.Application") InvoiceTemplate := ExtractFilePath(Application.ExeName) + "Report.doc";
MsWord.Documents.Add(InvoiceTemplate, EmptyParam, EmptyParam, EmptyParam);
WriteLn(LogFile, "Добавили документ по шаблону");
Wordgotobookmark("www");
WordInsertText(DateTimeToStr(Now));
end
И так далее...Посмотри help к VBA в word97 там чего найдешь..



Страницы: 1 вся ветка

Текущий архив: 2004.02.06;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.024 c
1-16495
Lt
2004-01-26 10:52
2004.02.06
Вставка рисунка в Word


1-16395
buka
2004-01-21 19:51
2004.02.06
Вопрос к тому кто занимался с Wise Installer


1-16474
sashok
2004-01-27 17:55
2004.02.06
Перевод информации из файла .xls в stringgrid


1-16309
Chuha
2004-01-25 16:56
2004.02.06
Прогрессия


1-16384
AlexNx
2004-01-22 11:50
2004.02.06
Execl