Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-16465
Натуся
2004-01-27 23:08
2004.02.06
Округление double


1-16477
Nic2
2004-01-27 14:51
2004.02.06
Инсталляция компонента


4-16799
bjohny
2003-11-24 10:18
2004.02.06
Вывод на экран


1-16265
Taras
2004-01-24 20:25
2004.02.06
Приложение в стиле Win XP


4-16785
DmitryMN
2003-12-01 18:41
2004.02.06
Закрытие DOS-приложения





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский