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

132 / 99 / 11

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

Сообщений: 544

1

06.12.2007, 12:47. Показов 6266. Ответов 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



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

83070 / 51649 / 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



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

83070 / 51649 / 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



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

              Новичок

              Профиль
              Группа: Участник
              Сообщений: 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. Если документ не удовлетворяет параметрам, то ворд должен закрываться и выводиться сообщение. Как это организовать наиболее верно? Прибегать к помощи меток не хочу.

              Albinos_x

              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. Что значит не удовлетворяет параметрам?

              ———————

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

              MetalFan

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

              Профиль
              Группа: Комодератор
              Сообщений: 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…

              RosemaN

              Новичок

              Профиль
              Группа: Участник
              Сообщений: 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

              Albinos_x

              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 условие будут выполняться только в случае выполнения предыдущего условия, поэтому их можно вкладывать внутрь предыдущих и соответственно отпадает надобность в каждом условии делать закрытие документа… 

              ———————

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

              Zorba

              Новичок

              Профиль
              Группа: Участник
              Сообщений: 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

              RosemaN

              Новичок

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

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

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

              Albinos_x

              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

              ———————

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

              RosemaN

              Новичок

              Профиль
              Группа: Участник
              Сообщений: 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

              Albinos_x

              Evil Skynet
              ****

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

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

              Delphi ругается?

              ———————

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

              ZVano

              Опытный
              **

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

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

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

              ———————

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

              Данкинг

              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.

              ZVano

              Опытный
              **

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

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

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

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

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

              ———————

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



















              Правила форума «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;

              >
              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,0491 ]   [ 16 queries used ]   [ Generated: 13.06.23, 21:16 GMT ]  

                          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.


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

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

                          Поиск:

                          Ответ в темуСоздание новой темы
                          Создание опроса
                          > Помогите побороть ошибку (EOleSysError) в MS Word, ошибка EOleSysError MS Word 

                          :(

                             

                          Опции темы

                          alexpotemkin
                            Дата 14.10.2008, 19:30 (ссылка)
                          | (нет голосов)
                          Загрузка ... Загрузка …




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

                          Цитата

                          Шустрый
                          *

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

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

                           

                          smile 
                          задача перебор текста по словам и сбор синонимов к словам
                          код в принципе стабилен, но вот нарисовался баг в обработке определенного текста при работе в Win XP и MS Office 2007
                          уже и пинял на новый формат док, ради этого и появилось открытие файла и сохранение его как текста (в коде видно)
                          Ошибка (EOleSysError ошибка на сервере) появляется в разных местах, что немного меня вгоняет в ступор, может кто с подобным сталкивался?
                          вот код

                          Код

                          var MSWord: Variant;
                              apppath: OleVariant;
                              SynonymInfo, TS: OleVariant;
                              i,j,s: Longint;
                              word,str_: String;
                              list: TStringList;
                          begin
                            if (Length(Q_ReplaceStr(FilenameEdit.Text,'"',''))<>0) and (FileExists(Q_ReplaceStr(FilenameEdit.Text,'"',''))) then begin
                              try
                                Screen.Cursor := crHourGlass;
                                MsWord := CreateOleObject('Word.Application');
                                apppath := Q_ReplaceStr(FilenameEdit.Text,'"','');
                                MsWord.Visible := False;
                                MsWord.Documents.Add(apppath, EmptyParam);
                                MsWord.ActiveDocument.SaveAs(FileName:=IncludeTrailingBackslash(ExtractFilePath(Application.ExeName)) + 'temp.txt',FileFormat:=wdFormatText);
                                MsWord.Documents.Close;
                                apppath := IncludeTrailingBackslash(ExtractFilePath(Application.ExeName)) + 'temp.txt';
                                MsWord.Visible := False;
                                MsWord.Documents.Add(apppath, EmptyParam);
                                if MsWord.ActiveDocument.Words.Count <> 0 then begin
                                  ProgressBar.Min := 1;
                                  ProgressBar.Max := MsWord.ActiveDocument.Words.Count;
                                  for i := 1 to MsWord.ActiveDocument.Words.Count do begin
                                    str_ := '';
                                    word := VarToStr(MsWord.ActiveDocument.Words.Item(i));
                                    Q_StrLower(word);
                                    Q_TrimInPlace(word);
                                    if (Length(word) > 3) and (Q_PosStr(word+'::',SynEdit.Text,1)=0) then begin
                                      SynonymInfo := MsWord.ActiveDocument.Words.Item(i).SynonymInfo;
                                      for j := 1 to SynonymInfo.MeaningCount do begin
                                        TS := SynonymInfo.SynonymList[j];
                                        for s := VarArrayLowBound(TS, 1) to VarArrayHighBound(TS, 1) do begin
                                          if Length(str_) = 0 then str_ := str_ + TS[s]
                                          else str_ := str_ + '**' + TS[s];
                                        end; //for s
                                      end; //for j
                                      SynonymInfo := EmptyParam;
                                      if Length(str_)<>0 then SynEdit.Lines.Add(word + '::' + str_);
                                    end;
                                    Application.ProcessMessages;
                                    StatusBar.Panels[5].Text := IntToStr(SynEdit.Lines.Count);
                                    ProgressBar.Position := i;
                                  end; //for i
                                end;
                                MsWord.Displayalerts := False;
                                MsWord.Documents.Close;
                                MsWord.Quit;
                                ProgressBar.Position := 0;
                                //
                                list := TStringList.Create;
                                list.Sorted := True;
                                list.Duplicates := dupIgnore;
                                list.Assign(SynEdit.Lines);
                                SynEdit.Clear;
                                SynEdit.Lines.Assign(list);
                                list.Free;
                                DeleteFile(IncludeTrailingBackslash(ExtractFilePath(Application.ExeName)) + 'temp.txt');
                                //
                                StatusBar.Panels[5].Text := IntToStr(SynEdit.Lines.Count);
                                Screen.Cursor := crDefault;
                                ShowMessage('Обработка файла успешно закончена! В словаре - ' + IntToStr(SynEdit.Lines.Count) + ' строк');
                              except
                                on E:Exception do begin
                                  MsWord.Displayalerts := False;
                                  MsWord.Documents.Close;
                                  MsWord.Quit;
                                  Screen.Cursor := crDefault;
                                  ShowMessage(E.Message + #10#13 + E.ClassName);
                                end;
                              end; //try
                            end;
                          end;

                          текст могу предоставить

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




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

                          Цитата

                          Evil Skynet
                          ****

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

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

                          Цитата(alexpotemkin @  14.10.2008,  19:30 Найти цитируемый пост)
                          Ошибка (EOleSysError ошибка на сервере) появляется в разных местах

                          разных местах текста или кода?

                          ———————

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

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




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

                          Цитата

                          Шустрый
                          *

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

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

                          ту Альбинос_Икс — ошибка возникала в разных местах обрабатываемого текста 

                          ошибку вроде как устранил (по крайней мере на тестах сбоев не было на всех проблемных текстах), слегка подправив исходный код

                          далее вопрос smile Какими способами увеличивать скорость обработки, последовательность работы видно. Чего подскажите господа?

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




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

                          Цитата

                          Evil Skynet
                          ****

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

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

                          читать весь текст одним махом

                          ———————

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

                          PM MAIL ICQ   Вверх
                          alexpotemkin
                            Дата 19.10.2008, 03:27 (ссылка)
                          | (нет голосов)
                          Загрузка ... Загрузка …




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

                          Цитата

                          Шустрый
                          *

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

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

                          это как?

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




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

                          Цитата

                          Evil Skynet
                          ****

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

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

                          WordDocument1.Content.Text

                          ———————

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

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




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

                          Цитата

                          Шустрый
                          *

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

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

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

                          Еще вопрос по следующей ошибке — Ошибка тезауруса. Текущий сеанс поиска синонимов завершен. EOleException

                          Запарил этот тезаурус. Нид хэлп товарищи.

                          Это сообщение отредактировал(а) alexpotemkin — 20.10.2008, 13:46

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




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

                          Цитата

                          Evil Skynet
                          ****

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

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

                          Цитата(alexpotemkin @  20.10.2008,  07:13 Найти цитируемый пост)
                          а смысл читать его одним махом? что это даст? если мне все равно нужно получить каждое слово, а затем в тезаурусе выбрать для него синонимы.

                          уменьшение количества обращений к серверу, а следовательно и скорость обработки. А получить каждое слово можно и из переменной типа String

                          Цитата(alexpotemkin @  20.10.2008,  07:13 Найти цитируемый пост)
                          Еще вопрос по следующей ошибке — Ошибка тезауруса. Текущий сеанс поиска синонимов завершен. EOleException

                          код в студию

                          ———————

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

                          PM MAIL ICQ   Вверх
                          alexpotemkin
                            Дата 23.10.2008, 08:25 (ссылка)
                          | (нет голосов)
                          Загрузка ... Загрузка …




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

                          Цитата

                          Шустрый
                          *

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

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

                          вот код, могу пример скинуть проблемных кусков текста (впринципе достаточно создать вордовский файл вот с таким текстом — смотрим смысла сначала улучш улучшения уля улучш улучшения уменьшают), облом (Ошибка тезауруса. Текущий сеанс поиска синонимов завершен. EOleException) наступает уже на слове «смысла», почему так не могу понять пока, пока не могу.
                          в используется функции библиотеки QStrings

                          Код

                          procedure TFormMain.TBStartClick(Sender: TObject);
                          var MSWord, apppath, SynonymInfo, TS: OleVariant;
                              i,j,s,k: Longint;
                              word,str,text: String;
                              list: TStringList;
                              in_word: Boolean;
                          begin
                            if (Length(Q_ReplaceStr(FilenameEdit.Text,'"',''))<>0) and (FileExists(Q_ReplaceStr(FilenameEdit.Text,'"',''))) then begin
                              try
                                Screen.Cursor := crHourGlass;
                                list := TStringList.Create;
                                list.Sorted := True;
                                list.Duplicates := dupIgnore;
                                MsWord := CreateOleObject('Word.Application');
                                apppath := Q_ReplaceStr(FilenameEdit.Text,'"','');
                                MsWord.Displayalerts := False;
                                MsWord.Visible := False;
                                MsWord.Documents.Add(apppath, EmptyParam);
                                //
                                text := MsWord.ActiveDocument.Content.Text;
                                in_word := False;
                                j := Length(text);
                                word := '';
                                for i := 1 to j do begin
                                  if in_word then begin
                                    if (Ord(text[i])>=$C0) or (Ord(text[i])=$A8) or (Ord(text[i])=$B8) then begin
                                      word := word + AnsiLowerCase(text[i]);
                                    end
                                    else begin
                                      in_word := False;
                                      if Length(word)>=5 then list.Add(Trim(word));
                                      word := '';
                                    end;
                                  end
                                  else begin
                                    if (Ord(text[i])>=$C0) or (Ord(text[i])=$A8) or (Ord(text[i])=$B8) then begin
                                      in_word := true;
                                      word := AnsiLowerCase(text[i]);
                                    end
                                  end;
                                end;
                                //
                                ProgressBar.Min := 0;
                                ProgressBar.Max := list.Count - 1;
                                ProgressBar.Position := 0;
                                for i := 0 to list.Count - 1 do begin
                                  str := '';
                                  word := list.Strings[i];
                                  if (Length(word) > 3) and (MsWord.CheckSpelling(word)) then begin
                                    VarClear(SynonymInfo);
                                    SynonymInfo := MsWord.SynonymInfo[word, wdRussian]; //// !!!!!!!!!!! Вывалеваемся вот в этом месте
                                    if (not VarIsEmpty(SynonymInfo)) and (not VarIsNull(SynonymInfo)) and (SynonymInfo.Found) then begin
                                        str := '';
                                        k := SynonymInfo.MeaningCount;
                                        if k >= 2 then begin
                                        for j := 1 to k do begin
                                          TS := SynonymInfo.SynonymList[j];
                                          for s := VarArrayLowBound(TS, 1) to VarArrayHighBound(TS, 1) do begin
                                            if Length(str) = 0 then str := str + TS[s]
                                            else str := str + '**' + TS[s];
                                          end; //for s
                                        end; //for j
                                        if Length(str)<>0 then SynEdit.Lines.Add(word + '::' + str);
                                        end;
                                    end;
                                  end;
                                  if Q_CopyRight(IntToStr(i),1)='5' then Application.ProcessMessages;
                                  StatusBar.Panels[5].Text := IntToStr(SynEdit.Lines.Count);
                                  ProgressBar.Position := i;
                                end; //for
                                //
                                MsWord.ActiveDocument.Close;
                                MsWord.Quit;
                                ProgressBar.Position := 0;
                                StatusBar.Panels[5].Text := IntToStr(SynEdit.Lines.Count);
                                Screen.Cursor := crDefault;
                                ShowMessage('Обработка файла успешно закончена! В словаре - ' + IntToStr(SynEdit.Lines.Count) + ' строк');
                              except
                                on E:Exception do begin
                                  MsWord.Displayalerts := False;
                                  MsWord.ActiveDocument.Close;
                                  MsWord.Quit;
                                  Screen.Cursor := crDefault;
                                  ShowMessage(E.Message + #10#13 + E.ClassName);
                                  ShowMessage(tmp);
                                  Exit;
                                end;
                              end; //try
                            end;
                          end;

                          PM MAIL   Вверх



















                          Ответ в темуСоздание новой темы
                          Создание опроса
                          Правила форума «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 | Следующая тема »

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