Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Delphi и Word.

6.9K
20 марта 2006 года
Britney
69 / / 20.03.2006
Есть прога на Delphi. При запуске создается DocumentWord. Че-то там происходит в нем и появляется необходимость закрыть документ (щелкаю в правом верхнем углу Word'a на крестик). Вместе с самим Word'ом закрывается и процесс WinWord. А моя прога по-прежнему работает! После того как Word закрылся у моей проги может появиться нужда снова открыть DocumentWord. Но на сей раз система выдает некритическую ошибку "Сервер RCP недоступен" и обламывает меня!Если же WordDocument не закрывать, то все работает и можно еще сколько угодно раз запустить документы.Используются компаненты WordApplication и WordDocument. Как сделать так, чтобы всегда была возможность запустить Word?
6.9K
20 марта 2006 года
Britney
69 / / 20.03.2006
И ещё один вопрос. Как программно можно узнать версию WORD?
15K
21 марта 2006 года
Mattew Freeman
12 / / 11.02.2006
ну во первых так как ты используешь в своей проге сервера ворда. то надо учитывать то что юзер может закрыть ворд соответственно как то проверять что твой док "на плову" и жив. есен пень что закрыв ворд он пишет тебе что сервис недоступен. детально изучи демо пример из делфи в папке Delphi7Demos\ActiveX\OleAuto\SrvComp\Word
я думаю он разрешит все вопросы связанные с работой с вордом
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;
2.0K
04 апреля 2006 года
Neko
25 / / 14.11.2002
Цитата:
Originally posted by Britney
После того как Word закрылся у моей проги может появиться нужда снова открыть DocumentWord. Но на сей раз система выдает некритическую ошибку "Сервер RCP недоступен" и обламывает меня!Если же WordDocument не закрывать, то все работает и можно еще сколько угодно раз запустить документы.


Вот с этим багом я сталкивался. Просто ставит меня в тупик. Мы с коллегой бились, но ничего не придумали. Главное, что у Excel такого глюка нет! А у ворды, если само приложение не закрывать, то документы можно и закрывать и открывать, а вызов приложения срабатывает только один раз за время жизни твоего процесса. Если юзер закрывает WordApplication, то прям хоть программу закрывай.... ;о((

339
04 апреля 2006 года
verybadbug
619 / / 12.09.2005
Цитата:
Originally posted by Britney
Прога у меня занимается тем, что создает отчеты. Для этого она находит в вордовском шаблоне метку(например NAME) и на ее место вставляет что-нить из полей формы.




А почему бы не использовать EK_RTF?

339
05 апреля 2006 года
verybadbug
619 / / 12.09.2005
Цитата:
Originally posted by Britney
Все бы хорошо, но процесс замены меток на данные из формы занимает от 2 до 5 секунд, независимо от мощности компа...



Чтобы небыло тормозов при замене надо отключать проверку орфографии и грамматики...

 
Код:
{Turn Spell checking of because it takes a long time if enabled and slows down Winword}
    WordApplication1.Options.CheckSpellingAsYouType := False;
    WordApplication1.Options.CheckGrammarAsYouType := False;
11K
05 апреля 2006 года
kuanysh
20 / / 13.07.2005
Просто делай WordApplication.Disconnect;
6.9K
05 апреля 2006 года
Britney
69 / / 20.03.2006
Цитата:
Originally posted by Neko
Вот с этим багом я сталкивался. Просто ставит меня в тупик. Мы с коллегой бились, но ничего не придумали. Главное, что у Excel такого глюка нет! А у ворды, если само приложение не закрывать, то документы можно и закрывать и открывать, а вызов приложения срабатывает только один раз за время жизни твоего процесса. Если юзер закрывает WordApplication, то прям хоть программу закрывай.... ;о((


В начале делаешь так:
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);

причем у WordApplication должно быть изначально задано, что он сначала или создает новый процесс или конатится к уже существующему.
После всех операций делай так:
WordDocument1.Disconnect;
WordApplication1.Disconnect;
и все на 5+. Бился над этим три дня - ответ пришел во сне. Вывод: надо больше спать - полезно и для ума и для здоровья.

6.9K
06 апреля 2006 года
Britney
69 / / 20.03.2006
Цитата:
Originally posted by verybadbug
Чтобы небыло тормозов при замене надо отключать проверку орфографии и грамматики...
 
Код:
{Turn Spell checking of because it takes a long time if enabled and slows down Winword}
    WordApplication1.Options.CheckSpellingAsYouType := False;
    WordApplication1.Options.CheckGrammarAsYouType := False;



Что-то не канает!А эта самая проверка орфографии отключается только для вставляемого текста или для всего документа (потому что в самом ворде проверка орфографии работает на загляденье)?Может я ее не в том месте вставил (до того как открыл документ,после того, как открыл документ, а для верности еще и когда подцепился к нему)? Время немного сократилось, но совсеееем на чуток!Какая еще вата может быть?

339
07 апреля 2006 года
verybadbug
619 / / 12.09.2005
Цитата:
Originally posted by Britney
Какая еще вата может быть?



попробуй такой алгоритм

Код:
var
  S: WideString;
...
begin
...
  S := WordDocument1.Range.Text;
...
  I := Pos('DATE', S);
  if I > 0 then begin
    Delete(S, I, 4);
    Insert(MaskEdit1.Text, S, I);
  end;
  //и так далее
...
  WordDocument1.Range.Text := S;
...  
end;
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог