Ошибка на сервере delphi word

132 / 99 / 11

Регистрация: 21.11.2007

Сообщений: 544

1

06.12.2007, 12:47. Показов 6254. Ответов 6


Студворк — интернет-сервис помощи студентам

Появилась проблема с запуском сервера 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)+'DocRepTempl.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… но на такой конфигурации программа работала вроде



0



132 / 99 / 11

Регистрация: 21.11.2007

Сообщений: 544

06.12.2007, 13:22

 [ТС]

2

Ошибка вылетает при попытке добавить документ («Documents.Add…»)



0



Администратор

83052 / 51631 / 244

Регистрация: 10.04.2006

Сообщений: 13,392

06.12.2007, 13:27

3

Какая ошибка? Полный текст плз.



0



132 / 99 / 11

Регистрация: 21.11.2007

Сообщений: 544

06.12.2007, 13:48

 [ТС]

4

class EOleException with message ‘Сервер RPC недоступен’

Я попробую в обработчике клика сделать освобождение памяти и создание сервера заново… Может поможет.

Есть еще соображение — может стоит на форму кинуть еще и компонент TWordDocument, но что-то сомневаюсь что в этом проблема



0



Администратор

83052 / 51631 / 244

Регистрация: 10.04.2006

Сообщений: 13,392

06.12.2007, 14:01

5

Лучший ответ Сообщение было отмечено mik-a-el как решение

Решение

Примерно так:

Код

WordApplication1.Connect;
WordApplication1.Documents.Add(EmptyParam, EmptyParam, EmptyParam, EmptyParam);
WordDocument1.ConnectTo(WordApplication1.ActiveDocument);
...
WordApplication1.Disconnect;



1



132 / 99 / 11

Регистрация: 21.11.2007

Сообщений: 544

06.12.2007, 14:04

 [ТС]

6

Все — исправил сам…
В обработчик события «quit» Сервера Word1 вписал код:

А в обработчике клика (вернее в вызываемом действии) написал:

Код

Word1:=TwordApplication.Create(RGMainForm);

PS: извините за то, что тема «немного не в тему» Я в основном на С++ пишу (эта программка мелкая, вспомогательная), поэтому совсем вылетело из головы, что паскалевский код не в ту ветку пихать надо было… Простите



0



132 / 99 / 11

Регистрация: 21.11.2007

Сообщений: 544

06.12.2007, 14:07

 [ТС]

7

Ой ошибка произошла… Вот как должно быть:



0



>
Delphi убивает WinWord!!! Клич о помощи
, При работе с MS Word иногда умирает сам Ворд. HELP

  • Подписаться на тему
  • Сообщить другу
  • Скачать/распечатать тему

  


Сообщ.
#1

,
19.01.05, 23:30

    Перейдем сразу к сабжу. Моя программа для перевода .doc в .htm (не в стиле той, что из FAQ, а гораздо сложнее — с исправлением, дописыванием итд) почти готова. Но! После отработки программы в памяти остается процесс WINWORD.exe . Причем иногда после второго/третьего запуска программы он дублируется, иногда нет. А самое главное, что вроде бы я закрываю все правильно… с виду. Посему это будет первый вопрос — как завершить работу с Word _правильно_, не отлавливая оставшихся процессов :blink: и не добавляя использованную пямть в кучу руками :D :blink: ? Ах да, еще. При попытке работать с документом повторно, не перезапуская программу(мою), выдается сообщение об ошибке «Сервер RPC недоступен«. Как бороться с этим?

    Но главной проблемой является другое. Иногда Ворд просто перестает нормально работать! Причем в результате работы программы :o То есть Ворд запускается, документ в нем открывается… и ВСЁ. Более ничего с ним следать невозможно. Все опции меню, тулбаров и пр. серые. Доступна только команда «Открыть»… Лечится исключительно удалением и установкой заново офиса. Причем сам документ в полном порядке, после восстановления офиса его можно опять открыть — все будет нормально. Вопрос: из-за чего такое может случаться?

    Ах да, я использую раннее связывание. Переходить на позднее сейчас уже нереально, да и скорее всего решение есть более простое.

    ExpandedWrap disabled

      type

          WordApplication: TWordApplication;

          WordDocument: TWordDocument;

      procedure TForm1.btnConvertClick(Sender: TObject);

      var

        fwname, fwReadonly:OleVariant;

        i, max_pars, pColor, redflag:Integer;

        paragraph_current:Paragraph;

      BEGIN

        fwname:=pathDoc.text;

        try

          begin

            WordApplication.Connect;

            fwReadonly:=True;

            WordApplication.Documents.Open(fwname,EmptyParam,

              fwReadonly, EmptyParam, EmptyParam, EmptyParam,

              EmptyParam, EmptyParam, EmptyParam, EmptyParam,

              EmptyParam, EmptyParam, EmptyParam, EmptyParam,

              EmptyParam);                                

            WordDocument.ConnectTo(WordApplication.ActiveDocument);

            WordApplication.Visible := False;

      (Обработка текста документа; записей в документ и вообще каких-либо изменений в нем не делается)

            WordDocument.Close;

            WordDocument.Disconnect;

            WordApplication.Quit;            

            WordApplication.Disconnect;

          end;

          except

            on E: Exception do begin

              ShowMessage(E.Message+IntToStr(E.HelpContext));

              WordDocument.Close;

              WordApplication.Quit;            

            end;

    Спасибо.
    Вик.

    Сообщение отредактировано: Shadowy — 19.01.05, 23:34


    tomsksmile



    Сообщ.
    #2

    ,
    20.01.05, 03:21

      Shadowy, меня насторожили вот эти строки

      ExpandedWrap disabled

        WordApplication.Documents.Open(fwname,EmptyParam,

                fwReadonly, EmptyParam, EmptyParam, EmptyParam,

                EmptyParam, EmptyParam, EmptyParam, EmptyParam,

                EmptyParam, EmptyParam, EmptyParam, EmptyParam,

                EmptyParam);                                

              WordDocument.ConnectTo(WordApplication.ActiveDocument);


      Shadowy



      Сообщ.
      #3

      ,
      20.01.05, 08:45

        Цитата tomsksmile @ 20.01.05, 03:21

        Shadowy, меня насторожили вот эти строки

        ExpandedWrap disabled

          WordApplication.Documents.Open(fwname,EmptyParam,

                  fwReadonly, EmptyParam, EmptyParam, EmptyParam,

                  EmptyParam, EmptyParam, EmptyParam, EmptyParam,

                  EmptyParam, EmptyParam, EmptyParam, EmptyParam,

                  EmptyParam);                                

                WordDocument.ConnectTo(WordApplication.ActiveDocument);

        А чем именно они настораживают?


        puncher



        Сообщ.
        #4

        ,
        20.01.05, 12:20

          Junior

          *

          Рейтинг (т): 1

          Обычно Word остается в памяти и перестает открываться, если в процессе отладки произошло ненормальное завершение. Надо убить его менеджером задач, и при новом запуске программы и все будет ОК.


          Dynamic



          Сообщ.
          #5

          ,
          20.01.05, 14:29

            Full Member

            ***

            Рейтинг (т): 16

            Попробуй так (или проверь, как у тебя). Вместо этого:

            Цитата Shadowy @ 19.01.05, 23:30

            WordDocument.Close;
            WordDocument.Disconnect;
            WordApplication.Quit;
            WordApplication.Disconnect;

            напиши

            ExpandedWrap disabled

              var f: OleVariant;

              ………

                   f := false;

                   WordDocument1.Close(f, EmptyParam,EmptyParam);

                   WordApplication.Disconnect;

            и в ИО для WordApplication:
            AutoConnect = false
            AutoQuit = True
            ConnectKind = ckNewInstance

            для WordDocument:
            AutoConnect = false
            ConnectKind = ckAttachToInterface

            У меня именно так работает, до этого тоже ловил

            Цитата

            «Сервер RPC недоступен».


            Guderian



            Сообщ.
            #6

            ,
            20.01.05, 15:13

              Крайне рекомендуется все com-объектам (WordApplication, WordDocument) присваивать nil по выходу. Оные присваивания вместе с Close, Quit, Disconnect лучше размещать в блоке finally. Тогда не будет необходимости дублировать их при нормальном выполнении и catch.

              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

              0 пользователей:

              • Предыдущая тема
              • Delphi: Общие вопросы
              • Следующая тема

              [ Script execution time: 0,0322 ]   [ 16 queries used ]   [ Generated: 6.06.23, 00:43 GMT ]  


              Форум программистов Vingrad

              Модераторы: MetalFan

              Поиск:

              Ответ в темуСоздание новой темы
              Создание опроса
              > открытие и закрытие сервера Word, сервер RPC не найден  

              :(

                 

              Опции темы

              RosemaN
                Дата 6.11.2007, 23:10 (ссылка)
              | (нет голосов)
              Загрузка ... Загрузка …




              Быстрая цитата

              Цитата

              Новичок

              Профиль
              Группа: Участник
              Сообщений: 19
              Регистрация: 4.11.2007

              Репутация: нет
              Всего: нет

              Код

              procedure TForm1.Button2Click(Sender: TObject);
              var fil,Templ,d,dd,ddd,SaveChanges: OLEVariant;
                col, c, r: Integer;
                Tbl: Table;
                S: String;

              begin
                OpenDoc:=False;
                SaveChanges:=False;
                WordApplication1.ConnectKind:=ckNewInstance;
                WordApplication1.AutoConnect:=True;
                WordApplication1.Visible:=True;
                Fil:='D:Akt_.doc';
                try
                  WordApplication1.Documents.OpenOld(Fil,EmptyParam,EmptyParam,
                  EmptyParam,EmptyParam,EmptyParam,
                  EmptyParam,EmptyParam,EmptyParam,
                  EmptyParam);
                  OpenDoc:=True;
                except
                  ShowMessage('документ не найден!');
                end;

                // проверка структуры документа
                If WordApplication1.ActiveDocument.Tables.Count <> 3 then
                begin
                  ShowMessage('Структура шаблона не верна!');
                  WordApplication1.ActiveDocument.Close(SaveChanges,EmptyParam,EmptyParam,);
                end;

                tbl:=WordApplication1.ActiveDocument.Tables.Item(1);
                If (Tbl.Rows.Count <> 6) and (Tbl.Columns.Count <> 4) then
                begin
                  ShowMessage('Структура шаблона не верна!');
                  WordApplication1.ActiveDocument.Close(SaveChanges,EmptyParam,EmptyParam,);
                end;

                  tbl:=WordApplication1.ActiveDocument.Tables.Item(2);
                If (Tbl.Rows.Count <> 6) and (Tbl.Columns.Count <> 2) then
                begin
                  ShowMessage('Структура шаблона не верна!');
                  WordApplication1.ActiveDocument.Close(SaveChanges,EmptyParam,EmptyParam,);
                end;

                  tbl:=WordApplication1.ActiveDocument.Tables.Item(3);
                If (Tbl.Rows.Count <> 11) and (Tbl.Columns.Count <> 2) then
                begin
                  ShowMessage('Структура шаблона не верна!');
                  WordApplication1.ActiveDocument.Close(SaveChanges,EmptyParam,EmptyParam,);
                end;

                  WordApplication1.ActiveDocument.SaveAs(Fil,EmptyParam,EmptyParam,EmptyParam,
                EmptyParam,EmptyParam,EmptyParam,
                EmptyParam,EmptyParam,EmptyParam,
                EmptyParam,EmptyParam,EmptyParam,
                EmptyParam,EmptyParam,EmptyParam);

                SaveChanges:=False;
                WordApplication1.ActiveDocument.Close(SaveChanges,EmptyParam,EmptyParam);
                WordApplication1.Quit;

                end;

              1. при первом вызове все работае отл, но если на орме нажать кнопку еще раз, то выскакивает ошибка «сервер RPC не доступен» и указывает на строчку, выделенную жирным. Как корректно закрыть и открыть Word?

              2. Если документ не удовлетворяет параметрам, то ворд должен закрываться и выводиться сообщение. Как это организовать наиболее верно? Прибегать к помощи меток не хочу.

              PM MAIL   Вверх
              Albinos_x
              Дата 10.11.2007, 18:49 (ссылка)
              | (нет голосов)
              Загрузка ... Загрузка …




              Быстрая цитата

              Цитата

              Evil Skynet
              ****

              Профиль
              Группа: Комодератор
              Сообщений: 3288
              Регистрация: 28.5.2004
              Где: X-6120400 Y-1 4624650

              Репутация: 15
              Всего: 108

              Цитата(RosemaN @  6.11.2007,  23:10 Найти цитируемый пост)
              1. при первом вызове все работае отл, но если на орме нажать кнопку еще раз, то выскакивает ошибка «сервер RPC не доступен» и указывает на строчку, выделенную жирным. Как корректно закрыть и открыть Word?

              у этого компанента есть событие : OnDocumentBeforeClose
              используй его для отслеживания закрылся ворд или нет… внутри события делай Disconnect с сервером…

              2. Что значит не удовлетворяет параметрам?

              ———————

              «Кто владеет информацией, тот владеет миром»    
              Уинстон Черчилль

              PM MAIL ICQ   Вверх
              MetalFan
              Дата 10.11.2007, 19:36 (ссылка)
              | (нет голосов)
              Загрузка ... Загрузка …




              Быстрая цитата

              Цитата

              Аццкий Сотона
              ****

              Профиль
              Группа: Комодератор
              Сообщений: 3815
              Регистрация: 2.10.2006
              Где: Moscow

              Репутация: 3
              Всего: 128

              брр… куча EmptyParams. пользуй позднее связывание. кушает чуть больше ресурсов, зато приятней программировать.

              Код

              var
                Test, Test1: Integer;
                MSWord: Variant;
                AString: Variant;
              begin
                MSWord := CreateOLEObject('Word.Application'); //Word 8
                MSWord.Documents.Open(FileName := 'd:test.doc', ReadOnly := True);
                MSWord.Visible := 1;
                Test := MSWord.FontNames.Count;
                for Test1 := 1 to Test do
                begin
                  AString := MSWord.FontNames.Item(Test1);
                  Memo1.Lines.Add(AString);
                end;
                MSWord.ActiveDocument.Range(Start := 0, end := 0);
              MSWord.ActiveDocument.Range.InsertAfter(Text := 'Заголовок');
              MSWord.ActiveDocument.Range.InsertParagraphAfter;
              MSWord.ActiveDocument.Range.Font.Name := 'Arial';
              MSWord.ActiveDocument.Range.Font.Size := 24;
              AString := MSWord.ActiveDocument.Range.Font.Name;
              Edit1.Text := AString;
              end;

              Это сообщение отредактировал(а) MetalFan — 10.11.2007, 19:38

              ———————

              There are always someone smarter than you…

              PM MAIL   Вверх
              RosemaN
              Дата 11.11.2007, 14:59 (ссылка)
              | (нет голосов)
              Загрузка ... Загрузка …




              Быстрая цитата

              Цитата

              Новичок

              Профиль
              Группа: Участник
              Сообщений: 19
              Регистрация: 4.11.2007

              Репутация: нет
              Всего: нет

              Цитата(Albinos_x @ 10.11.2007,  18:49)
              Цитата(RosemaN @  6.11.2007,  23:10 Найти цитируемый пост)
              1. при первом вызове все работае отл, но если на орме нажать кнопку еще раз, то выскакивает ошибка «сервер RPC не доступен» и указывает на строчку, выделенную жирным. Как корректно закрыть и открыть Word?

              у этого компанента есть событие : OnDocumentBeforeClose
              используй его для отслеживания закрылся ворд или нет… внутри события делай Disconnect с сервером…

              2. Что значит не удовлетворяет параметрам?

              Прошу прощ! Не переметрам, а условиям. У меня есть документ-шаблон с определенной структурой. Прога смотрит, удовлетворяет ли данный документ требованиям:

              Код

              If WordApplication1.ActiveDocument.Tables.Count <> 3 then
                begin
                  ShowMessage('Структура шаблона не верна! (количество таблиц)');
                  WordApplication1.ActiveDocument.Close(SaveChanges,EmptyParam,EmptyParam);
                  ExitEx;
                end;

                tbl:=WordApplication1.ActiveDocument.Tables.Item(1);
                If (Tbl.Rows.Count <> 6) and (Tbl.Columns.Count <> 4) then
                begin
                  ShowMessage('Структура шаблона не верна! (структура первой таблицы)');
                  WordApplication1.ActiveDocument.Close(SaveChanges,EmptyParam,EmptyParam);
                  ExitEx;
                end;

                  tbl:=WordApplication1.ActiveDocument.Tables.Item(2);
                If (Tbl.Rows.Count <> 6) and (Tbl.Columns.Count <> 2) then
                begin
                  ShowMessage('Структура шаблона не верна! (структура второй таблицы)');
                  WordApplication1.ActiveDocument.Close(SaveChanges,EmptyParam,EmptyParam);
                  ExitEx;
                end;

                  tbl:=WordApplication1.ActiveDocument.Tables.Item(3);
                If (Tbl.Rows.Count <> 11) and (Tbl.Columns.Count <> 2) then
                begin
                  ShowMessage('Структура шаблона не верна! (структура третьей таблицы)');
                  WordApplication1.ActiveDocument.Close(SaveChanges,EmptyParam,EmptyParam);
                  ExitEx;
                end;
              exitEx:
              WordApplication1.Quit;

              но такой вариант мне не нравится. Есть ли алтернатива более «удачная». Не хочу метки использовать.
              Т.е. во всех процедурах использовать disconnect, а при закрытии программы — quit? Получается, что при загруженной программе «висят» оба процесса (excel и word). Т.к. прога заполняет журнал *.xls и акт *.doc

              MetalFan,  а как использовать твой вариант? Дело в том, что когда искал инфу, то найти так и не смог что значит каждый EmptyParam допустим,  в WordApplication1.Documents.OpenOld().

              Это сообщение отредактировал(а) RosemaN — 11.11.2007, 15:32

              PM MAIL   Вверх
              Albinos_x
              Дата 11.11.2007, 17:53 (ссылка)
              | (нет голосов)
              Загрузка ... Загрузка …




              Быстрая цитата

              Цитата

              Evil Skynet
              ****

              Профиль
              Группа: Комодератор
              Сообщений: 3288
              Регистрация: 28.5.2004
              Где: X-6120400 Y-1 4624650

              Репутация: 15
              Всего: 108

              Цитата(RosemaN @  11.11.2007,  14:59 Найти цитируемый пост)
              WordApplication1.Documents.OpenOld()

              справка по VB в офисе…

              2, 3, 4 условие будут выполняться только в случае выполнения предыдущего условия, поэтому их можно вкладывать внутрь предыдущих и соответственно отпадает надобность в каждом условии делать закрытие документа… 

              ———————

              «Кто владеет информацией, тот владеет миром»    
              Уинстон Черчилль

              PM MAIL ICQ   Вверх
              Zorba
              Дата 12.11.2007, 13:40 (ссылка)
              | (нет голосов)
              Загрузка ... Загрузка …




              Быстрая цитата

              Цитата

              Новичок

              Профиль
              Группа: Участник
              Сообщений: 1
              Регистрация: 30.1.2007

              Репутация: нет
              Всего: нет

              Цитата(RosemaN @ 6.11.2007,  23:10)
              1. при первом вызове все работае отл, но если на орме нажать кнопку еще раз, то выскакивает ошибка «сервер RPC не доступен» и указывает на строчку, выделенную жирным. Как корректно закрыть и открыть Word?

              2. Если документ не удовлетворяет параметрам, то ворд должен закрываться и выводиться сообщение. Как это организовать наиболее верно? Прибегать к помощи меток не хочу.

              1.
              WordApplication1.CleanupInstance;
              в самом начале перед инициализацией сервера

              2.
              Var
              fls:OleVariant;
              begin
              fls:=false;
              ….
              WordParserModule.Documents.Close(fls,EmptyParam,EmptyParam);

              Это сообщение отредактировал(а) Zorba — 12.11.2007, 13:44

              PM MAIL   Вверх
              RosemaN
              Дата 15.11.2007, 00:33 (ссылка)
              | (нет голосов)
              Загрузка ... Загрузка …




              Быстрая цитата

              Цитата

              Новичок

              Профиль
              Группа: Участник
              Сообщений: 19
              Регистрация: 4.11.2007

              Репутация: нет
              Всего: нет

              все работает. Спасибо Albinos_x 
              Но теперь возникла другая проблема:
              1. Word висит в списке процессов и не выгружается даже когда я закрываю программу свою.
              2. Можно ли как-нибудь ускорить работу с WordApplication1?

              PM MAIL   Вверх
              Albinos_x
              Дата 16.11.2007, 21:02 (ссылка)
              | (нет голосов)
              Загрузка ... Загрузка …




              Быстрая цитата

              Цитата

              Evil Skynet
              ****

              Профиль
              Группа: Комодератор
              Сообщений: 3288
              Регистрация: 28.5.2004
              Где: X-6120400 Y-1 4624650

              Репутация: 15
              Всего: 108

              1.
              AutoQuit:=False;
              когда работать заканчиваешь с документом, закрывай его…
              если пользователь закрывает документ, то Disconnect с документом, если сервер, то с сервером. Соответсвенно для сервера использовать WordApplication, для документа использовать WordDocument
              если использовать AutoQuit:=True; , то ворд будет закрываться автоматически, но может возникнуть проблема с дисконектом, т.к. тогда и открытый документ будет закрываться (это в случае, если нужно, чтоб после дисконекта пользователь мог дальше работать с докуметом)

              2. Можно только оптимизацией алгоритма, а точнее — уменьшение количества обращений к серверу…
              или писать свой обработчик офисных файлов…
              кроме того, пока работает код программы, ворд лучше держать невидимым

              Это сообщение отредактировал(а) Albinos_x — 16.11.2007, 21:19

              ———————

              «Кто владеет информацией, тот владеет миром»    
              Уинстон Черчилль

              PM MAIL ICQ   Вверх
              RosemaN
              Дата 19.11.2007, 00:06 (ссылка)
              | (нет голосов)
              Загрузка ... Загрузка …




              Быстрая цитата

              Цитата

              Новичок

              Профиль
              Группа: Участник
              Сообщений: 19
              Регистрация: 4.11.2007

              Репутация: нет
              Всего: нет

              Цитата(Albinos_x @ 16.11.2007,  21:02)
              1.
              AutoQuit:=False;
              когда работать заканчиваешь с документом, закрывай его…
              если пользователь закрывает документ, то Disconnect с документом, если сервер, то с сервером. Соответсвенно для сервера использовать WordApplication, для документа использовать WordDocument
              если использовать AutoQuit:=True; , то ворд будет закрываться автоматически, но может возникнуть проблема с дисконектом, т.к. тогда и открытый документ будет закрываться (это в случае, если нужно, чтоб после дисконекта пользователь мог дальше работать с докуметом)

              2. Можно только оптимизацией алгоритма, а точнее — уменьшение количества обращений к серверу…
              или писать свой обработчик офисных файлов…
              кроме того, пока работает код программы, ворд лучше держать невидимым

              Код

              try
                // работа с документом  
                try
                    WordApplication1.ActiveDocument.SaveAs(Route,EmptyParam,EmptyParam,EmptyParam,
                    EmptyParam,EmptyParam,EmptyParam,
                    EmptyParam,EmptyParam,EmptyParam,
                    EmptyParam,EmptyParam,EmptyParam,
                    EmptyParam,EmptyParam,EmptyParam);
                except
                    on E: Exception do
                      ShowMessage('При создании директории произошла ошибка. Сообщение системы: '+ E.Message);
                end;
                WordApplication1.Dialogs.Item(wdDialogFilePrint);
                WordApplication1.Disconnect;// здесь должен быть WordDocument.Disconnect;
              except
                  on E: Exception do
                  begin
                    WordApplication1.Disconnect;
                    ShowMessage('Ошибка чтения файла. Сообщение системы: '+ E.Message);
                  end;
              end;

              вот такой код у меня получился. Но не могу вставить дисконнект с документом. Ругается 

              Это сообщение отредактировал(а) RosemaN — 19.11.2007, 00:08

              PM MAIL   Вверх
              Albinos_x
              Дата 22.11.2007, 21:09 (ссылка)
              | (нет голосов)
              Загрузка ... Загрузка …




              Быстрая цитата

              Цитата

              Evil Skynet
              ****

              Профиль
              Группа: Комодератор
              Сообщений: 3288
              Регистрация: 28.5.2004
              Где: X-6120400 Y-1 4624650

              Репутация: 15
              Всего: 108

              Delphi ругается?

              ———————

              «Кто владеет информацией, тот владеет миром»    
              Уинстон Черчилль

              PM MAIL ICQ   Вверх
              ZVano
              Дата 19.1.2010, 11:01 (ссылка)
              | (нет голосов)
              Загрузка ... Загрузка …




              Быстрая цитата

              Цитата

              Опытный
              **

              Профиль
              Группа: Участник
              Сообщений: 258
              Регистрация: 11.12.2006
              Где: Украина, Кривой Р ог

              Репутация: нет
              Всего: 4

              Спасибо участникам топика. Благодаря ему, я решил сходную проблему.
              Если у вас в программе используется Word, для работы с документом, который отображается пользователю, следует быть готовым к тому, что пользователь закроет Word. 
              После этого  работа с ним из программы приведет к исключению «Сервер RPC не найден».
              Для борьбы с традлом отлавливаем закрытие Word в WordApplication1.OnQuit и переоткрываем его.
              Сюда же нужно встроить проверку, а не уничтожается ли WordApplication1.
              Если уничтожается, то переоткрывать Word не надо. Иначе он будет висеть в процессах.

              ———————

              НЕ ФЛУДИМ. Пользуемся кнопками «+» или «-» для выражения своего отношения к теме или сообщению.
              Гуглим «Как правильно задавать вопросы»

              PM MAIL Skype   Вверх
              Данкинг
              Дата 19.1.2010, 11:52 (ссылка)
              | (нет голосов)
              Загрузка ... Загрузка …




              Быстрая цитата

              Цитата

              Yersinia pestis
              ****

              Профиль
              Группа: Завсегдатай
              Сообщений: 8302
              Регистрация: 7.11.2006
              Где: მოსკოვი

              Репутация: 5
              Всего: 130

              Цитата(ZVano @  19.1.2010,  11:01 Найти цитируемый пост)
              Если у вас в программе используется Word, для работы с документом, который отображается пользователю, следует быть готовым к тому, что пользователь закроет Word. 

              Если в программе используется  Word, то пользователю вообще его бы лучше не открывать. Так же и  Excel.

              ———————

              There’s nothing left but silent epitaphs.

              PM MAIL WWW   Вверх
              ZVano
              Дата 20.1.2010, 11:31 (ссылка)
              | (нет голосов)
              Загрузка ... Загрузка …




              Быстрая цитата

              Цитата

              Опытный
              **

              Профиль
              Группа: Участник
              Сообщений: 258
              Регистрация: 11.12.2006
              Где: Украина, Кривой Р ог

              Репутация: нет
              Всего: 4

              Цитата(Данкинг @ 19.1.2010,  11:52)
              Если в программе используется  Word, то пользователю вообще его бы лучше не открывать. Так же и  Excel.

              Не всегда это возможно.
              Что делать, если нужно в компоненте из шаблона документа сделать отчет, а затем либо сохранить его, либо показать пользователю?
              Сохранить — все ок.
              Показать —  могут быть траблы при генерации следущего отчета(если пользователь закрыл Word). В этом случае неплохо было бы поднимать еще один Word, а про старый забывать — пользователь сам закроет окно.

              Это сообщение отредактировал(а) ZVano — 20.1.2010, 11:33

              ———————

              НЕ ФЛУДИМ. Пользуемся кнопками «+» или «-» для выражения своего отношения к теме или сообщению.
              Гуглим «Как правильно задавать вопросы»

              PM MAIL Skype   Вверх



















              Ответ в темуСоздание новой темы
              Создание опроса
              Правила форума «Delphi: ActiveX/СОМ/CORBA»

              Rrader
              Girder

              Запрещено:

              1. Публиковать ссылки на вскрытые компоненты

              2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

              • Литературу по Delphi обсуждаем здесь
              • Действия модераторов можно обсудить здесь
              • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
              • Вопросы по реализации алгоритмов рассматриваются здесь
              • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) — крупнейшем в рунете сборнике материалов по Delphi
              • Вопросы по SQL и вопросы по базам данных, не связанные с Delphi, задавать здесь

              Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.

               

              0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
              0 Пользователей:
              « Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема »

              Actually, I think that the problem is simply that Word is busy doing a modal dialog and so can’t respond to external COM calls. This trivial code produces the same error:

              procedure TForm1.Button1Click(Sender: TObject);
              begin
                Caption := MSWord.ActiveDocument.Name;
              end;
              

              Probably the simplest way to avoid this problem is to head it off before if happens. If you are using the TWordApplication server that comes with Delphi (on the Servers components tab), you can attach an event handler to its OnDocumentBeforeClose and use that to present your own «Save Y/N?» dialog and set the event’s Cancel param to True to prevent Word’s dialog from appearing.

              Update: If you try experimenting with this code while the Save dialog is popped up

              procedure TForm1.Button1Click(Sender: TObject);
              var
                vWin,
                vDoc,
                vApp : OleVariant;
              begin
                vWin := MSWord.ActiveWindow;
                Caption := vWin.Caption;
                vDoc := vWin.Document;
              
                vApp := vDoc.Application;  //  Attempt to read Word Document property
              
                Caption := vDoc.Path + '';
                Caption := Caption + vDoc.Name;
              end;
              

              I think you’ll find that any attempt to read from the vDoc object will result in the «Call was rejected …» message, so I am beginning to think that this behaviour is by design — it’s telling you that the object is not in a state that it can be interacted with.

              Interestingly, it is possible to read the Caption property of the vWin Window object, which will tell you the filename of the file but not the file’s path.

              Realistically, I still think your best option is to try and get the OnDocumentBeforeClose event working. I don’t have Word 2010 installed on this machine by Word 2007 works fine with the Word server objects derived from Word2000.Pas so you might try those instead of Word2010.Pas, just to see.

              Another possibility is simply to catch the «Call was rejected …» exception, maybe return «Unavailable» as the document FullName, and try again later.

              If you’re not using TWordApplication and don’t know how to catch the OnDocumentBeforeClose for the method your using to access Word, let me know how you are accessing it and I’ll see if I can dig out some code to do it.

              I vaguely recall there’s a way of detecting that Word is busy with a modal dialog — I’ll see if I can find where I saw that a bit later if you still need it. Your IOleMessageFilter looks more promising than anything I’ve found as yet, though.

              6.9K

              04 апреля 2006 года

              Britney

              69 / / 20.03.2006

              Теперь у меня появился другой вопрос. Прога у меня занимается тем, что создает отчеты. Для этого она находит в вордовском шаблоне метку(например NAME) и на ее место вставляет что-нить из полей формы (например, Петров Казимир Эдмундович). Специально для этого у меня написаны примитивные процедурки, типа такой:

              procedure TForm1.N3Click(Sender: TObject); //ПРИКАЗ НА ОТЧИСЛЕНИЕ
              var len,a,b:OleVariant;
              i:integer;
              FileName:OleVariant;
              begin
              Stop;
              FiLeName:=ShablonName+’приказ на отчисление.doc’;
              for i:=1 to 2 do
              WordApplication1.Documents.Open(FileName,
              EmptyParam,EmptyParam,EmptyParam,
              EmptyParam,EmptyParam,EmptyParam,
              EmptyParam,EmptyParam,EmptyParam,
              EmptyParam,EmptyParam,EmptyParam,
              EmptyParam,EmptyParam);

              WordDocument1.ConnectKind:=ckAttachToInterface;
              WordDocument1.ConnectTo(WordApplication1.ActiveDocument);

              len:=Length(WordDocument1.Range.Text); //DATE
              for i:=1 to len-4 do
              begin
              a:=i;
              b:=i+4;
              if WordDocument1.Range(a,b).Text=’DATE’ then
              begin
              WordDocument1.Range(a,b).InsertAfter(MaskEdit1.Text);
              WordDocument1.Range(a,b).Cut;
              break;
              end;
              end;

              len:=Length(WordDocument1.Range.Text); //NAME
              for i:=1 to len-4 do
              begin
              a:=i;
              b:=i+4;
              if WordDocument1.Range(a,b).Text=’NAME’ then
              begin
              WordDocument1.Range(a,b).InsertAfter(Edit7.Text+’ ‘+Edit8.Text+’ ‘+Edit9.Text);
              WordDocument1.Range(a,b).Cut;
              break;
              end;
              end;

              len:=Length(WordDocument1.Range.Text); //SPEC
              for i:=1 to len-4 do
              begin
              a:=i;
              b:=i+4;
              if WordDocument1.Range(a,b).Text=’SPEC’ then
              begin
              WordDocument1.Range(a,b).InsertAfter(Edit12.Text);
              WordDocument1.Range(a,b).Cut;
              break;
              end;
              end;

              len:=Length(WordDocument1.Range.Text); //GROUP
              for i:=1 to len-5 do
              begin
              a:=i;
              b:=i+5;
              if WordDocument1.Range(a,b).Text=’GROUP’ then
              begin
              WordDocument1.Range(a,b).InsertAfter(Edit11.Text);
              WordDocument1.Range(a,b).Cut;
              break;
              end;
              end;

              len:=Length(WordDocument1.Range.Text); //DAT2
              for i:=1 to len-4 do
              begin
              a:=i;
              b:=i+4;
              if WordDocument1.Range(a,b).Text=’DAT2′ then
              begin
              WordDocument1.Range(a,b).InsertAfter(MaskEdit2.Text);
              WordDocument1.Range(a,b).Cut;
              break;
              end;
              end;

              len:=Length(WordDocument1.Range.Text); //DECAN
              for i:=1 to len-5 do
              begin
              a:=i;
              b:=i+5;
              if WordDocument1.Range(a,b).Text=’DECAN’ then
              begin
              WordDocument1.Range(a,b).InsertAfter(Edit1.Text+’ ‘+Edit2.Text+’ ‘+Edit3.Text);
              WordDocument1.Range(a,b).Cut;
              break;
              end;
              end;

              if (Image1.Picture.Height>0) and (CheckBox1.Checked) then
              begin
              Clipboard.Assign(Image1.Picture); //@}
              len:=Length(WordDocument1.Range.Text);
              for i:=1 to len-1 do
              begin
              a:=i;
              b:=i+1;
              if WordDocument1.Range(a,b).Text=’@’ then
              begin
              WordDocument1.Range(a,b).paste;
              break;
              end;
              end;
              end;

              WordDocument1.Disconnect;
              WordApplication1.Disconnect;
              Play;
              end;

              Все бы хорошо, но процесс замены меток на данные из формы занимает от 2 до 5 секунд, независимо от мощности компа!Я прекрасно понимаю, что поиском меток можно заниматься и в фоновом режиме, а не при нажатии кнопок, но это все неважно! Меня интерисует почему все так долго происходит. Дело в Office или в используемых мною операциях, например:
              WordDocument1.Range(a,b).Text=’@’;
              WordDocument1.Range(a,b).paste;

              Понравилась статья? Поделить с друзьями:
            • Ошибка на стиральной машине hansa p09
            • Ошибка на сервере 504 дневник ру
            • Ошибка на стиральной машине hansa e22
            • Ошибка на сервере 502 дневник ру что это
            • Ошибка на стиральной машине haier unb что делать