Форум: "Основная";
Текущий архив: 2004.02.06;
Скачать: [xml.tar.bz2];
ВнизОтчет в 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;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.037 c