Модераторы: 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 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 259
Регистрация: 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 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 259
Регистрация: 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 | Следующая тема »


 




[ Время генерации скрипта: 0.0640 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.