132 / 99 / 11 Регистрация: 21.11.2007 Сообщений: 544 |
|
1 |
|
06.12.2007, 12:47. Показов 6266. Ответов 6
Появилась проблема с запуском сервера Word. Код 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 |
Все — исправил сам… А в обработчике клика (вернее в вызываемом действии) написал: Код 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. Код 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 |
Все — исправил сам… А в обработчике клика (вернее в вызываемом действии) написал: Код 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
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
Перейдем сразу к сабжу. Моя программа для перевода .doc в .htm (не в стиле той, что из FAQ, а гораздо сложнее — с исправлением, дописыванием итд) почти готова. Но! После отработки программы в памяти остается процесс WINWORD.exe . Причем иногда после второго/третьего запуска программы он дублируется, иногда нет. А самое главное, что вроде бы я закрываю все правильно… с виду. Посему это будет первый вопрос — как завершить работу с Word _правильно_, не отлавливая оставшихся процессов и не добавляя использованную пямть в кучу руками ? Ах да, еще. При попытке работать с документом повторно, не перезапуская программу(мою), выдается сообщение об ошибке «Сервер RPC недоступен«. Как бороться с этим? Но главной проблемой является другое. Иногда Ворд просто перестает нормально работать! Причем в результате работы программы То есть Ворд запускается, документ в нем открывается… и ВСЁ. Более ничего с ним следать невозможно. Все опции меню, тулбаров и пр. серые. Доступна только команда «Открыть»… Лечится исключительно удалением и установкой заново офиса. Причем сам документ в полном порядке, после восстановления офиса его можно опять открыть — все будет нормально. Вопрос: из-за чего такое может случаться? Ах да, я использую раннее связывание. Переходить на позднее сейчас уже нереально, да и скорее всего решение есть более простое.
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 |
|
Shadowy, меня насторожили вот эти строки
WordApplication.Documents.Open(fwname,EmptyParam, fwReadonly, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam); WordDocument.ConnectTo(WordApplication.ActiveDocument); |
Shadowy |
|
Цитата tomsksmile @ 20.01.05, 03:21 Shadowy, меня насторожили вот эти строки
WordApplication.Documents.Open(fwname,EmptyParam, fwReadonly, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam); WordDocument.ConnectTo(WordApplication.ActiveDocument); А чем именно они настораживают? |
puncher |
|
Junior Рейтинг (т): 1 |
Обычно Word остается в памяти и перестает открываться, если в процессе отладки произошло ненормальное завершение. Надо убить его менеджером задач, и при новом запуске программы и все будет ОК. |
Dynamic |
|
Full Member
Рейтинг (т): 16 |
Попробуй так (или проверь, как у тебя). Вместо этого: Цитата Shadowy @ 19.01.05, 23:30
WordDocument.Close; напиши
var f: OleVariant; ……… f := false; WordDocument1.Close(f, EmptyParam,EmptyParam); WordApplication.Disconnect;
и в ИО для WordApplication: для WordDocument: У меня именно так работает, до этого тоже ловил Цитата «Сервер RPC недоступен». |
Guderian |
|
Крайне рекомендуется все 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 | |||
Новичок Профиль Репутация: нет |
1. при первом вызове все работае отл, но если на орме нажать кнопку еще раз, то выскакивает ошибка «сервер RPC не доступен» и указывает на строчку, выделенную жирным. Как корректно закрыть и открыть Word? 2. Если документ не удовлетворяет параметрам, то ворд должен закрываться и выводиться сообщение. Как это организовать наиболее верно? Прибегать к помощи меток не хочу. |
||
Albinos_x | |||
Evil Skynet Профиль
Репутация: 15 |
у этого компанента есть событие : OnDocumentBeforeClose 2. Что значит не удовлетворяет параметрам? ——————— «Кто владеет информацией, тот владеет миром» |
||
MetalFan | |||
Аццкий Сотона Профиль
Репутация: 3 |
брр… куча EmptyParams. пользуй позднее связывание. кушает чуть больше ресурсов, зато приятней программировать.
Это сообщение отредактировал(а) MetalFan — 10.11.2007, 19:38 ——————— There are always someone smarter than you… |
||
RosemaN | |||||||
Новичок Профиль Репутация: нет |
Прошу прощ! Не переметрам, а условиям. У меня есть документ-шаблон с определенной структурой. Прога смотрит, удовлетворяет ли данный документ требованиям:
но такой вариант мне не нравится. Есть ли алтернатива более «удачная». Не хочу метки использовать. MetalFan, а как использовать твой вариант? Дело в том, что когда искал инфу, то найти так и не смог что значит каждый EmptyParam допустим, в WordApplication1.Documents.OpenOld(). Это сообщение отредактировал(а) RosemaN — 11.11.2007, 15:32 |
||||||
Albinos_x | |||
Evil Skynet Профиль
Репутация: 15 |
справка по VB в офисе… 2, 3, 4 условие будут выполняться только в случае выполнения предыдущего условия, поэтому их можно вкладывать внутрь предыдущих и соответственно отпадает надобность в каждом условии делать закрытие документа… ——————— «Кто владеет информацией, тот владеет миром» |
||
Zorba | |||
Новичок Профиль Репутация: нет |
1. 2. Это сообщение отредактировал(а) Zorba — 12.11.2007, 13:44 |
||
RosemaN | |
Новичок Профиль Репутация: нет |
все работает. Спасибо Albinos_x |
Albinos_x | |
Evil Skynet Профиль
Репутация: 15 |
1. 2. Можно только оптимизацией алгоритма, а точнее — уменьшение количества обращений к серверу… Это сообщение отредактировал(а) Albinos_x — 16.11.2007, 21:19 ——————— «Кто владеет информацией, тот владеет миром» |
RosemaN | |||||
Новичок Профиль Репутация: нет |
вот такой код у меня получился. Но не могу вставить дисконнект с документом. Ругается Это сообщение отредактировал(а) RosemaN — 19.11.2007, 00:08 |
||||
Albinos_x | |
Evil Skynet Профиль
Репутация: 15 |
Delphi ругается? ——————— «Кто владеет информацией, тот владеет миром» |
ZVano | |
Опытный Профиль
Репутация: нет |
Спасибо участникам топика. Благодаря ему, я решил сходную проблему. ——————— НЕ ФЛУДИМ. Пользуемся кнопками «+» или «-» для выражения своего отношения к теме или сообщению. |
Данкинг | |||
Yersinia pestis Профиль
Репутация: 5 |
Если в программе используется Word, то пользователю вообще его бы лучше не открывать. Так же и Excel. ——————— There’s nothing left but silent epitaphs. |
||
ZVano | |||
Опытный Профиль
Репутация: нет |
Не всегда это возможно. Это сообщение отредактировал(а) ZVano — 20.1.2010, 11:33 ——————— НЕ ФЛУДИМ. Пользуемся кнопками «+» или «-» для выражения своего отношения к теме или сообщению. |
||
Правила форума «Delphi: ActiveX/СОМ/CORBA» | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, 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
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
Перейдем сразу к сабжу. Моя программа для перевода .doc в .htm (не в стиле той, что из FAQ, а гораздо сложнее — с исправлением, дописыванием итд) почти готова. Но! После отработки программы в памяти остается процесс WINWORD.exe . Причем иногда после второго/третьего запуска программы он дублируется, иногда нет. А самое главное, что вроде бы я закрываю все правильно… с виду. Посему это будет первый вопрос — как завершить работу с Word _правильно_, не отлавливая оставшихся процессов и не добавляя использованную пямть в кучу руками ? Ах да, еще. При попытке работать с документом повторно, не перезапуская программу(мою), выдается сообщение об ошибке «Сервер RPC недоступен«. Как бороться с этим? Но главной проблемой является другое. Иногда Ворд просто перестает нормально работать! Причем в результате работы программы То есть Ворд запускается, документ в нем открывается… и ВСЁ. Более ничего с ним следать невозможно. Все опции меню, тулбаров и пр. серые. Доступна только команда «Открыть»… Лечится исключительно удалением и установкой заново офиса. Причем сам документ в полном порядке, после восстановления офиса его можно опять открыть — все будет нормально. Вопрос: из-за чего такое может случаться? Ах да, я использую раннее связывание. Переходить на позднее сейчас уже нереально, да и скорее всего решение есть более простое.
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 |
|
Shadowy, меня насторожили вот эти строки
WordApplication.Documents.Open(fwname,EmptyParam, fwReadonly, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam); WordDocument.ConnectTo(WordApplication.ActiveDocument); |
Shadowy |
|
Цитата tomsksmile @ 20.01.05, 03:21 Shadowy, меня насторожили вот эти строки
WordApplication.Documents.Open(fwname,EmptyParam, fwReadonly, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam); WordDocument.ConnectTo(WordApplication.ActiveDocument); А чем именно они настораживают? |
puncher |
|
Junior Рейтинг (т): 1 |
Обычно Word остается в памяти и перестает открываться, если в процессе отладки произошло ненормальное завершение. Надо убить его менеджером задач, и при новом запуске программы и все будет ОК. |
Dynamic |
|
Full Member
Рейтинг (т): 16 |
Попробуй так (или проверь, как у тебя). Вместо этого: Цитата Shadowy @ 19.01.05, 23:30
WordDocument.Close; напиши
var f: OleVariant; ……… f := false; WordDocument1.Close(f, EmptyParam,EmptyParam); WordApplication.Disconnect;
и в ИО для WordApplication: для WordDocument: У меня именно так работает, до этого тоже ловил Цитата «Сервер RPC недоступен». |
Guderian |
|
Крайне рекомендуется все 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 |
|
||
Шустрый Профиль Репутация: нет
|
текст могу предоставить |
||
|
|||
Albinos_x |
|
||
Evil Skynet Профиль
Репутация: 15
|
разных местах текста или кода? ——————— «Кто владеет информацией, тот владеет миром» |
||
|
|||
alexpotemkin |
|
||
Шустрый Профиль Репутация: нет
|
ту Альбинос_Икс — ошибка возникала в разных местах обрабатываемого текста ошибку вроде как устранил (по крайней мере на тестах сбоев не было на всех проблемных текстах), слегка подправив исходный код далее вопрос Какими способами увеличивать скорость обработки, последовательность работы видно. Чего подскажите господа? |
||
|
|||
Albinos_x |
|
||
Evil Skynet Профиль
Репутация: 15
|
читать весь текст одним махом ——————— «Кто владеет информацией, тот владеет миром» |
||
|
|||
alexpotemkin |
|
||
Шустрый Профиль Репутация: нет
|
это как? |
||
|
|||
Albinos_x |
|
||
Evil Skynet Профиль
Репутация: 15
|
WordDocument1.Content.Text ——————— «Кто владеет информацией, тот владеет миром» |
||
|
|||
alexpotemkin |
|
||
Шустрый Профиль Репутация: нет
|
а смысл читать его одним махом? что это даст? если мне все равно нужно получить каждое слово, а затем в тезаурусе выбрать для него синонимы. Еще вопрос по следующей ошибке — Ошибка тезауруса. Текущий сеанс поиска синонимов завершен. EOleException Запарил этот тезаурус. Нид хэлп товарищи. Это сообщение отредактировал(а) alexpotemkin — 20.10.2008, 13:46 |
||
|
|||
Albinos_x |
|
||||
Evil Skynet Профиль
Репутация: 15
|
уменьшение количества обращений к серверу, а следовательно и скорость обработки. А получить каждое слово можно и из переменной типа String
код в студию ——————— «Кто владеет информацией, тот владеет миром» |
||||
|
|||||
alexpotemkin |
|
||
Шустрый Профиль Репутация: нет
|
вот код, могу пример скинуть проблемных кусков текста (впринципе достаточно создать вордовский файл вот с таким текстом — смотрим смысла сначала улучш улучшения уля улучш улучшения уменьшают), облом (Ошибка тезауруса. Текущий сеанс поиска синонимов завершен. EOleException) наступает уже на слове «смысла», почему так не могу понять пока, пока не могу.
|
||
|
|||
|
Правила форума «Delphi: ActiveX/СОМ/CORBA» | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) |
0 Пользователей: |
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема » |