Появилась проблема с запуском сервера Word.
При нажатии на кнопочку запускается приложение Word, в нем создается документ и в этот документ пишутся данные... На морде моей проги лежит сервер с параметрами по-умолчанию (AutoConnect = false; AutoQuit = false; ConnectKind = ckRunningOrNew...
Если я запустил Ворд и снова нажимаю кнопку, то появляется еще одно окно Ворд (так и должно быть), но как только я закрыл последнее окно Ворд, то все обращения к переменной Word1 вызывают ошибку "сервер RPCS недоступен"... Вот код функции:
Код:
procedure TRGMainForm.actRefreshExecute(Sender: TObject);var s : string; ov: OleVariant; I : integer;begin s := ExtractFilePath(Application.ExeName)+DocepTempl.doc; with Word1 do begin Create(RGMainForm); ov:= OleVariant(s); Documents.Add(ov,EmptyParam,EmptyParam,EmptyParam); // замена шаблонов реальными значениями WriteValue(docnum,ProtNum.Text); WriteValue(devnum,DevNum.Text); WriteValue(docdate,DateTimeToStr(DocDate.DateTime)); WriteValue(error,Error.Text); WriteValue(diap1,diap1.Text); WriteValue(diap2,diap2.Text); WriteValue(etdev,etdev.Text); WriteValue(temp,temp.Text); WriteValue(press,press.Text); WriteValue(vlaj,vlaj.Text); WriteValue(etunit,RecArr[1].uname); WriteValue(devunit,RecArr[1].uname); for I := 1 to 10 do begin s := et + IntToStr(I); WriteValue(s,FloatToStr(RecArr[i].et)); s := avup + IntToStr(I); WriteValue(s,FloatToStr(RecArr[i].avUp)); s := avdwn + IntToStr(I); WriteValue(s,FloatToStr(RecArr[i].avDwn)); s := relup + IntToStr(I); WriteValue(s,FloatToStr(RecArr[i].relUp)); s := reldwn + IntToStr(I); WriteValue(s,FloatToStr(RecArr[i].relDwn)); s := var + IntToStr(I); WriteValue(s,FloatToStr(RecArr[i].relVar)); end; Visible := true; end;end;
PS: у меня в системе стоят MSOffice2000 и 2007... но на такой конфигурации программа работала вроде
Ошибка вылетает при попытке добавить документ ("Documents.Add...")
Какая ошибка? Полный текст плз.
class EOleException with message Сервер RPC недоступен
Я попробую в обработчике клика сделать освобождение памяти и создание сервера заново... Может поможет.
Есть еще соображение - может стоит на форму кинуть еще и компонент TWordDocument, но что-то сомневаюсь что в этом проблема
Примерно так:
Код:
WordApplication1.Connect;WordApplication1.Documents.Add(EmptyParam, EmptyParam, EmptyParam, EmptyParam);WordDocument1.ConnectTo(WordApplication1.ActiveDocument);...WordApplication1.Disconnect;
Все - исправил сам...
В обработчик события "quit" Сервера Word1 вписал код:
Код:
Word1.quit;
А в обработчике клика (вернее в вызываемом действии) написал:
Код:
Word1:=TwordApplication.Create(RGMainForm);
PS: извините за то, что тема "немного не в тему" Я в основном на С++ пишу (эта программка мелкая, вспомогательная), поэтому совсем вылетело из головы, что паскалевский код не в ту ветку пихать надо было... Простите
Ой ошибка произошла... Вот как должно быть:
Код:
Word1.Destroy;