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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> определить закрыт Word или нет 
:(
    Опции темы
Albinos_x
Дата 26.4.2005, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


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

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



Решил проблему....

Код
...
var
  Form1: TForm1;
  CreaDok: OleVariant;
...
CreaDok:=WordApplication1.Documents.Add(EmptyParam,EmptyParam,EmptyParam,EmptyParam);
...
procedure TForm1.SpeedButton1Click(Sender: TObject);
var SaveChanges, templ:olevariant;
    s: string;
begin
WordApplication1.AutoQuit:=false;
try
// определяю закрытие документа
  if not VarIsEmpty(CreaDok) then
     begin
     s:=ExtractFilePath(Application.ExeName)+'Temp\Отчёт '+ DateToStr(DateTimePicker1.Date);
     while (FileExists(s+'.doc')) do
        begin
        s:=s+' Copy';
        end;
     Templ:=s+'.doc';
     // если не сохранён
     if WordApplication1.ActiveDocument.Saved=false then
          // сохраняю
        WordApplication1.ActiveDocument.SaveAs(Templ, EmptyParam, EmptyParam, EmptyParam,
                                                      EmptyParam, EmptyParam, EmptyParam,
                                                      EmptyParam, EmptyParam, EmptyParam,
                                                      EmptyParam, EmptyParam, EmptyParam,
                                                      EmptyParam, EmptyParam, EmptyParam);
     SaveChanges:=false;
     // закрываю документ
     WordApplication1.ActiveDocument.Close(SaveChanges,EmptyParam,EmptyParam);
     // закрываю ворд
     WordApplication1.Application.Quit(SaveChanges,EmptyParam,EmptyParam);
     end;
finally
 // если произошла ошибка
 // а она произойдёт, если пользователь документ закрыл
   WordApplication1.AutoConnect:=false;
   WordApplication1.Destroy;
 Application.Terminate;
 end;
end;
...


Только в Form1Close(), эта штука не работает. Пришлось BorderIcons отключить полностью


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Fantasist
Дата 5.5.2005, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


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

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



А зачем определять, запущен Word или нет?
Вообще реккомендую закладкой servers не пользоваться. Лучше брать только интерфейсы и создавать объекты в run-time - гораздо меньше происходит неожиданных вещей да и из кода очевидно, что происходит.




--------------------
Волны гасят ветер...
PM MAIL   Вверх
Akella
Дата 6.5.2005, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



Значит ты неправильно его закрываешь
нужно так
Код

Var
  Excel:variant;
begin
...

  Excel.Quit;
  Excel := Unassigned;

у меня всё работает
PM MAIL   Вверх
Albinos_x
Дата 7.5.2005, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


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

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



Цитата
Значит ты неправильно его закрываешь
нужно так


дело в том что в моём случае ошибка возникает ещё до закрытия и вообще при попытке оперирования с этим документом в программе


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Girder
Дата 7.5.2005, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


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

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



Albinos_x
1. тебе Fantasist дельный совет дал.
2. Конструкцией try except end - не стоит пренебригать.
3. А если у пользователя 150 документов в Word-е? smile

PS: Не забудь создавать(если у тебя её нет) папку "Temp" - Word - за тебя енто не сделает... smile

Вот код:
Код
uses ComObj;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
const wdFormatDocument = $00000000;
var Word,Doc:IDispatch;
    pn,s:string;
    i:integer;
begin
 try
  Word:=GetActiveOleObject('Word.Application');
 except
  Word:=nil;
 end;
 if Word<>nil then
  begin
   try
    Doc:=Variant(Word).ActiveDocument;
   except
    Doc:=nil;
   end;
  end;
 pn:=ExtractFilePath(ParamStr(0))+'Temp\Отчёт '+DateToStr(Now);
 while Doc<>nil do
  begin
   i:=0;
   while (FileExists(pn+' - '+IntToStr(i)+'.doc')) do inc(i);
   s:=pn+' - '+IntToStr(i)+'.doc';
   try
    if Variant(Doc).Saved=false then
     Variant(Doc).SaveAs(s,wdFormatDocument,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
                         EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam);

   except
   end;
   try
    Variant(Doc).Close(false,EmptyParam,EmptyParam);
    Doc:=Variant(Word).ActiveDocument;
   except
    Doc:=nil;
   end;
  end;
 if Word<>nil then
  begin
   try
    Variant(Word).Application.Quit(false,EmptyParam,EmptyParam);
   except
   end;
  end;
end;


PS2: При запуске кода из под Delphi - могут выдаваться ошибки - но не при обычном запуске проги.

Особо... не отлаживал - так что теоретически... smile могут быть ошибки в коде.

И самое главное... так как ентот код ты хочеш засунуть в OnClose - не забудь выдавать для пользователя какое-нить сообщение... типо "Подождите пожалуйста"... smile

Удачи.

Это сообщение отредактировал(а) Girder - 7.5.2005, 13:25


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Fantasist
Дата 7.5.2005, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


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

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



Girder у нас же описания интерфейсов есть - зачем нам с Dispatcheм мучаться.

Я бы переписал это так:

Код

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
    unk:IUnknown;
    Word:_Application;
    Doc:_Document;
    pn,s:string;
    i:integer;
begin
 GetActiveObject(CLASS_WordApplication,0,unk);
 if unk=nil then exit;

 unk.QueryInterface(_Application,Word);
 if Word<>nil then
 begin
   try
     Doc:=Word.ActiveDocument;
     pn:=ExtractFilePath(ParamStr(0))+'Temp\Îò÷¸ò '+DateToStr(Now);
     while Doc<>nil do
     begin
       i:=0;
       while (FileExists(pn+' - '+IntToStr(i)+'.doc')) do inc(i);

       s:=pn+' - '+IntToStr(i)+'.doc';
       try
        if Doc.Saved=false then
          Doc.SaveAs(s,wdFormatDocument,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
                    EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam);
        Doc.Close(false,EmptyParam,EmptyParam);
       except
       end;

       Doc:=Word.ActiveDocument;
     end;
   except
   end;

   try
     Word.Quit(false,EmptyParam,EmptyParam);
   except
   end;
 end;
end;


Обработка ошибок, конечно, выглядит не очень, но пойдет. smile
Добавлено @ 19:08
Цитата(Girder @ 7.5.2005, 10:22)
3. А если у пользователя 150 документов в Word-е?


Тогда компутер у него сдохнет еще до запуска этой программы. smile

Это сообщение отредактировал(а) Fantasist - 7.5.2005, 19:08


--------------------
Волны гасят ветер...
PM MAIL   Вверх
Albinos_x
Дата 7.5.2005, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


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

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



Цитата
2. Конструкцией try except end - не стоит пренебригать.


не пренебрегаю... (см. мой вариант)

Цитата
3. А если у пользователя 150 документов в Word-е?


Проверял на 5 одновременно открытых документах - закрывается тот который нужен. (в моём варианте)

Цитата
PS: Не забудь создавать(если у тебя её нет) папку "Temp" - Word - за тебя енто не сделает...


и такое есть...

Цитата
PS2: При запуске кода из под Delphi - могут выдаваться ошибки - но не при обычном запуске проги.


знаю, но всё равно, спасибо за предупреждение...
----------------------------------------------
Цитата
Тогда компутер у него сдохнет еще до запуска этой программы.

smile smile smile

PS: ваши варианты пока не проверял...

Цитата
Вообще рекомендую закладкой servers не пользоваться. Лучше брать только интерфейсы и создавать объекты в run-time - гораздо меньше происходит неожиданных вещей да и из кода очевидно, что происходит.


Когда это понял, уже было поздно переделывать прогу...На тот момент уже около 5 тыс. строк... Даже с коментариями очень сложно осуществлять навигацию... Сейчас прежде чем, чего-то туда вставить, приходится сначала делать оттельно и уже рабочий вариант кода туда вставлять и даже с таким подходом возникают иногда проблеммы (сегодня неожиданно одна процедура, в которую вставлял новую функцию, стала выдавать переполнение стека...)

Спасибо всем за помощь!!! smile smile smile


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Albinos_x
Дата 27.6.2005, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


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

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



Цитата
PS: ваши варианты пока не проверял...


Предложенные варианты хорошие, но работают не совсем так как я хотел...

моё конечное решение:

Код
...
var
  Form1: TForm1;
  OpenDoc:boolean = false;
...
// при создании  документа
WordDocument1.ConnectTo(WordApplication1.ActiveDocument);
 OpenDoc:=true;
...
procedure TForm1.WordDocument1Close(Sender: TObject);
begin
OpenDoc:=false;
WordDocument1.Disconnect;
WordApplication1.Disconnect;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var s :string;
    SaveChanges, templ : olevariant;
begin
if OpenDoc then
   begin
   s:=ExtractFilePath(Application.ExeName)+'Temp\отчёт '+ DateToStr(DateTimePicker1.Date);
   while (FileExists(s+'.doc')) do
        begin
        Application.ProcessMessages;
        s:=s+' Copy';
        end;
       Templ:=s+'.doc';
     // если не сохранен, то
     if WordApplication1.ActiveDocument.Saved=false then
          // сохраняем
          begin
         WordApplication1.ActiveDocument.SaveAs(Templ, EmptyParam, EmptyParam, EmptyParam,
                                                        EmptyParam, EmptyParam, EmptyParam,
                                                        EmptyParam, EmptyParam, EmptyParam,
                                                        EmptyParam, EmptyParam, EmptyParam,
                                                        EmptyParam, EmptyParam, EmptyParam);
          end;
     SaveChanges:=false;
     WordApplication1.ActiveDocument.Close(SaveChanges,EmptyParam,EmptyParam);
   end;
end;
...


работает на ура и никаких ошибок не возникает...

еще раз всем спасибо за участие и дельные советы smile

Это сообщение отредактировал(а) Albinos_x - 19.7.2005, 17:38


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Akella
Дата 30.6.2005, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



При раннем связывании всё работает быстрее и проверка типов и ошибок происходит уже на стадии компилирования
Хотя при позднем связывании тоже есть свои прелести
PM MAIL   Вверх
Albinos_x
Дата 19.7.2005, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


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

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



Обнаружил, что при некоторых настройках винды, событие FormClose почему-то не обрабатывается... Поэтому приведённый выше код запихнул в событие FormDestroy(Sender: TObject). Тогда проблем не возникнет...


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0609 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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