Как закрыть WORD после передачи в него данных?

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
mpn2
Бывалый
Сообщения: 62
Зарегистрирован: 24 Февраль 2015, 17:15

Как закрыть WORD после передачи в него данных?

Сообщение mpn2 »

Всем привет.
Пришлось написать выгрузку в WORD (Clarion 6.3 шаблоны Синявского). Никогда не писал, поэтому пишу методом научного тыка.
Столкнулся с тем, что надо после передачи данных в WORD не только закрыть документ но и корректно закрыть WORD.

Подскажите: а как корректно закрыть WORD???

Код: Выделить всё

   Loc:WordFileName = Clip(CONF:Path_Shablon_WORD)                              ! Каталог и имя шаблонного документа
   Loc:SaveFileName = Clip(CONF:Path_Save_WORD) &'вх.'& Clip(UCH:Number) &'.doc'! Каталог для хранения файлов  + имя
  
   feqOLE=create(0,CREATE:Ole)                                                  ! создали OLE-контрол
   feqOLE{Prop:Create} = 'Word.Application'                                     ! сказали, что этот контрол использует Word
   feqOLE{Prop:ReportException} = TRUE                                          ! для отладки - показываем все сообщения об ошибках OLE
   feqOLE{'Visible'} = 1                                                        ! показали Word
   feqOLE{'Documents.Open("'& clip(Loc:WordFileName) &'")'}                     ! Открываем шаблон документа


!Работаем с файлом заполняем данные
!==============================================================================================================================
   do Find_Replace


!Сохраняем файл WORD
!==============================================================================================================================
   feqOLE{'Application.Selection.GoTo(11, 1)'}                                  ! встали на начало документа
   feqOLE{'Application.ActiveDocument.SaveAs("'& Clip(Loc:SaveFileName) &'")'}  ! сохранили документ под другим именем






   if CONF:Close_File then                                                      ! Закроем документ если надо
          feqOLE{'Documents.Close()'}                                              ! Закрываем документ
          
       ??????? А КАК закрыть WORD ??????                                      ! ??????? А КАК закрыть WORD 
   
   end




   ! уничтожили OLE-контрол ---------------------------------
   loop 3 times
      destroy(feqOLE) ! уничтожили OLE-контрол
   end
   !---------------------------------------------------------
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Как закрыть WORD после передачи в него данных?

Сообщение Дед Пахом »

Можно TerminateProcess api, можно WMI командой Terminate. Если есть WinEvent или OddJob от Capesoft, то там должно быть что-то подходящее.
С уважением, ДП
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Как закрыть WORD после передачи в него данных?

Сообщение Дед Пахом »

mpn2 писал(а): 25 Март 2022, 14:30 ! уничтожили OLE-контрол ---------------------------------
loop 3 times
destroy(feqOLE) ! уничтожили OLE-контрол
end
Хотя этот кусок по идее должен убить процесс.
С уважением, ДП
kreator
✯ Ветеран ✯
Сообщения: 4983
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 20 раз

Как закрыть WORD после передачи в него данных?

Сообщение kreator »

У меня вот так:

Код: Выделить всё

 ?Word{'AppClose'}
 ?Word{PROP:Deactivate}
В Экселе вот так - 'Workbooks.Close'.
Понятно, после всего. Destroy вряд ли закроет. Хотя не факт.
Ещё замечание. Пример кочует от одного к другому. Ему сто лет и никто творчески к нему не подходит. Дестроя достаточного одного!!! А "feqOLE{'Visible'} = 1" катастрофически снижает скорость обработки и ещё вдобавок показывает пользователю ненужные вещи.
We are hard at work… for you. :)
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Как закрыть WORD после передачи в него данных?

Сообщение Дед Пахом »

kreator писал(а): 25 Март 2022, 15:54 Дестроя достаточного одного!
Не увидел, что 3 раза вызывается DESTROY, я думал что речь про PROP:Deactivate.
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Как закрыть WORD после передачи в него данных?

Сообщение Игорь Столяров »

mpn2 писал(а): 25 Март 2022, 14:30 feqOLE{'Application.ActiveDocument.SaveAs("'& Clip(Loc:SaveFileName) &'")'}
Время идёт, лучше замените для совместимости с современными релизами на:

Код: Выделить всё

  feqOLE{'Application.ActiveDocument.SaveAs2("'& Clip(Loc:SaveFileName) &'")'}
За теми кто отстал - не возвращаться. (С) Кодекс
kreator
✯ Ветеран ✯
Сообщения: 4983
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 20 раз

Как закрыть WORD после передачи в него данных?

Сообщение kreator »

Да, время идёт, а Вы всё сохраняете в .doc.
We are hard at work… for you. :)
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Как закрыть WORD после передачи в него данных?

Сообщение Игорь Столяров »

kreator писал(а): 25 Март 2022, 17:02 Да, время идёт, а Вы всё сохраняете в .doc.
Можно и явно указать формат сохранения DOCX:

Код: Выделить всё

  feqOLE{'Application.ActiveDocument.SaveAs2("' & Clip(Loc:SaveFileName) & '",16)'}
но лучше этого не делать. Я поясню. Если поклонник таланта г-на Синявского юзает офисный пакет
времён выпуска шаблонов его имени - то для него формат по умолчанию DOC, а если Office 365 - то DOCX.
Вот и всё. И от расширения имени файла с документом это не зависит ... :)
За теми кто отстал - не возвращаться. (С) Кодекс
kreator
✯ Ветеран ✯
Сообщения: 4983
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 20 раз

Как закрыть WORD после передачи в него данных?

Сообщение kreator »

Игорь Столяров писал(а): 25 Март 2022, 17:28 И от расширения имени файла с документом это не зависит ...
Как это? А как сохранить в другие форматы? Например, в rtf?
We are hard at work… for you. :)
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1376
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 7 раз
Поблагодарили: 1 раз
Контактная информация:

Как закрыть WORD после передачи в него данных?

Сообщение RaFaeL »

RTF лучше создавать прямой записью в файл, без ОЛЕ
viewtopic.php?p=40286#p40286
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Как закрыть WORD после передачи в него данных?

Сообщение Игорь Столяров »

RaFaeL писал(а): 25 Март 2022, 18:58 RTF лучше создавать прямой записью в файл, без ОЛЕ
Та косой тот класс RTF, как заяц. Я в той же ветке сырость решения показывал ... :(
kreator писал(а): 25 Март 2022, 18:29 А как сохранить в другие форматы? Например, в rtf?
Вот здесь все поддерживаемые форматы для SaveAs2: https://docs.microsoft.com/ru-ru/office ... saveformat
Смотрите, пока ещё пускают нашего брата к сокровищам цивилизации ... ;)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
SergioRaguzini
Старожил
Сообщения: 236
Зарегистрирован: 08 Декабрь 2009, 19:16
Откуда: Краснодарский край
Благодарил (а): 6 раз

Как закрыть WORD после передачи в него данных?

Сообщение SergioRaguzini »

Привет Всем!

Есть еще одна, непонятная для меня ситуация при работе с Word, когда после экспорта отчета в файл MsWord и дальнейшим PROP:Deactivate, в Диспетчере задач Windows остается работающим в фоне процесс winword.exe хотя окно Word закрыто и внешне вроде бы это ничему не мешает. И хрен бы с этим, при перезагрузке Windows, Диспетчер задач все равно очистится и на обычном рабочем месте такое даже и не заметишь, Однако, лет пять назад, на круглосуточно работающем ПК, в висящей в трее программе пришлось за один раз сразу формировать больше 100 word-файлов (файлы для каждого пациента, содержат ФИО, рекомендации и т.п.) и потом они рассылаются через e-mail или REST-приложениие. Через несколько дней ПК начинает "тупить" когда в Диспетчере задач таких winword.exe уже несколько тысяч. Т.е. PROP:Deactivate не "убивает" сам процесс. Пришлось получать список запущенных процессов winword.exe и закрывать их принудительно (для этого, когда пользователь завопил "караул", пришлось сделать в течении часа на AutoIt exe-утилитку командной строки, нормально работает и переделывать ее теперь лень)

kreator писал(а): 25 Март 2022, 17:02 Да, время идёт, а Вы всё сохраняете в .doc
Прошу подсказки, как, например, в С6.3 получить готовый PDF-файл без Preview, так чтобы потом можно было выполнять с ним стандартные файловые операции (например, "копировать"). Или файл иного формата, который бы обычный пользователь мог бы без труда открыть на ПК или мобильном телефоне.

Спасибо
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Как закрыть WORD после передачи в него данных?

Сообщение Игорь Столяров »

SergioRaguzini писал(а): 25 Март 2022, 19:22 Прошу подсказки, как, например, в С6.3 получить готовый PDF-файл без Preview
Пардон. А PDF файл с чем ? Вы хотите экспортировать в него REPORT или сами создать его содержание ?
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Как закрыть WORD после передачи в него данных?

Сообщение Игорь Столяров »

SergioRaguzini писал(а): 25 Март 2022, 19:22 непонятная для меня ситуация при работе с Word
Это детская ошибка, сто лет назад её обсуждали подробно.
Нужно корректно завершить документ и закрыть приложение Microsoft Word.
А вот потом уже гасить объект и контрол. ;)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
SergioRaguzini
Старожил
Сообщения: 236
Зарегистрирован: 08 Декабрь 2009, 19:16
Откуда: Краснодарский край
Благодарил (а): 6 раз

Как закрыть WORD после передачи в него данных?

Сообщение SergioRaguzini »

Игорь Столяров писал(а): 25 Март 2022, 19:29 Пардон. А PDF файл с чем ? Вы хотите экспортировать в него REPORT или сами создать его содержание ?
Ну да - экспортировать REPORT
Ответить