23.06.2009, 17:11 | #1 |
Участник
|
Приветствую, коллеги! Нужна помощь...
Имеется вывод данных в ВОРД, в котором понадобилось кое-что переделать т.е. пользователь получал окно с файлом, печатал его закрывал - и вуаля. Теперь понадобилось файл открыть, кое-что с ним сделать и тут же закрыть. wdApp.Visible := FALSE; wdDoc := wdApp.Documents.Open(FileName); .... wdApp.Visible := TRUE; ..... wdDoc.Close; CLEAR(wdApp); В этой ситуации все проходит нормально - окно Ворда отсатеся, пользователь, закрывая его, жмет на крестик, и все завершается благополучно. ======= Теперь то же самое, но с автозакрытием окна Ворда: ======== wdApp.Visible := FALSE; wdDoc := wdApp.Documents.Open(FileName); .... wdApp.Visible := TRUE; .... wdApp.Visible := FALSE; wdDoc.Close; CLEAR(wdApp); Вот тут начинаются непонятки. Окно ворда закрывается, очищение Аутомэйшн стоит. Но с памяти стабильно остается паразитный процесс winword! Он держит открытым файл, и, соответственно, не дает второй раз запустить отчет, пока не завершишь задачу. В чем может быть проблема? Пыталась задейстовать CLEAR дважды (кхе-кхе), wdApp.Quit, wdApp.DocumentActive.Close и т.п., но была посылаема Навом после отработки отчета... Других способов зачистки процесса не знаю... Кто-нибудь сталкивался с такой проблемой? |
|
24.06.2009, 15:49 | #2 |
Участник
|
Судя по всему, никто не знает...
В общем, проблему удалесь объегорить, создавая каждый раз документ новый по счетчику (т.е. если такой уже есть в директории, прибавляется к названию счетчк) Соответственно, НАВ не натыкается на оставленный в памяти процесс и ошибки удается избегать. Я боялась, что таким образом в памяти накопится куча недобитых процессов, но этого не случилось - там все время в результате один. Короче, проблему удалось решить - не очень красиво, но работает. |
|
24.06.2009, 22:12 | #3 |
Участник
|
процесс оставлять в памяти не есть гуд..
в свое время писал такой код, но сейчас нет возможности проверить.. если не ошибаюсь, вторая ветка как раз закрывает окно и снимает процесс, в случае, если пользователь в диалоговом окне печати выбрал что-то кроме как печать.. надеюсь понятно, что на протяжении все предыдущей процедуры заполнения документа он остается невидимым.. [codebox] IF wdApp.Dialogs.Item(88).Show = -1 THEN BEGIN //если отправили на печать, то приложение не закрываем, //т.к. неизвестно, успело ли уйти на печать wdDocNew.Close; IF ERASE(FileName) THEN; END ELSE BEGIN SaveChanges := 0; OriginalFormat := 1; RouteDoc := FALSE; wdDocNew.Close; IF ERASE(FileName) THEN; IF NOT ISCLEAR(wdApp) THEN wdApp.Quit(SaveChanges,OriginalFormat,RouteDoc); END;[/codebox] а еще, чтобы Нав не конфликтовал с запущенными на машине пользователя процессами (ворда или экселя), использовал CREATE(wdApp,TRUE), где второй параметр указывает, что это новый инстанс приложения.. по-моему так.. пусть гуру поправят |
|
25.06.2009, 18:01 | #4 |
Участник
|
Sova, в Вашем коде не хватает wdApp.QUIT после wdDoc.Close;
Именно этот оператор закрывает приложение. CLEAR не закрывает приложение. В коде Apnik как раз и использует данный метод для закрытия Ворда. |
|
26.06.2009, 13:23 | #5 |
Участник
|
Цитата:
Стабильно выдает ошибку CAL после отработки отчета. Делать CREATE с флагом TRUE думала, но, боюсь, это каждый раз будет порождать новый паразитный процесс - они же никуда не деваются. Обязательно посмотрю код, данный выше, спасибо! |
|
26.06.2009, 14:46 | #6 |
Участник
|
Попробовала код с очищением процесса.
Quit теперь отработал без ошибок (возможно, я изначально писала с неверным синтаксисом) Но invisible процесс в памяти живее всех живых Я вот теперь думаю - не связано ли это как-то с выводом Ворда в PDF. Т.е. я открываю ВОРД из шаблона в сети, сохраняю клиентскую копию с изменениями, делаю его видимым, печатаю на принтер Adobe PDF затем делаю его невидимым и пытаюсь очистить (invisible=FALSE, Close, Clear, Quit....) Все отрабатывает верно, в итоге, но процесс в памяти все равно остается |
|
26.06.2009, 16:04 | #7 |
Участник
|
да, файл Ворд перед wdApp CLEAR удаляется (ERASE), и в натуре тоже удалятся, т.е. с этим все чисто...
|
|
26.06.2009, 16:08 | #8 |
Участник
|
Последовательность должна быть следующая:
CREATE(wdApp, TRUE); Открытие документа wdDoc := wdApp.Open(); Печать Закрытие документа - wdDoc.Close CLEAR(wdDoc) Закрытие приложения wdApp.Quit CLEAR(wdApp) А видимость и сохранение копии на клиентском компьютере для чего? Я в своей последовательности эти пункты специально опустил. И будьте внимательны - процесс Ворда может висеть и не тот, который убили. Например, произошла ошибка, и ворд остался невидимым. В следующий раз все отработало правильно и приложение закрыто, но предыдущее то еще в памяти и Вы можете видеть его. |
|
26.06.2009, 22:09 | #9 |
Участник
|
Sova, если wdApp.Quit отрабатывает, как Вы говорите, то приложения быть не должно. Варианта вижу два. Или он не отрабатывает корректно, но ошибку не выдает (например, Вы умышленно подавляете все диалоги и вопросы Word - это как раз можно проверить), или все же процесс не тот. Понаблюдайте количество процессов word при отладке - в какой момент что в памяти появляется и исчезает.
И, если процесс в памяти действительно остается Ваш, то лучше, на мой взгляд, открывать его без файла данных. Пользователь сможет тогда закрыть пустое окно word сам, обычным крестиком. Я столкнулся как-то с проблемой, что из-за загрузки компа, сети, принтера или чего-то еще, файл не всегда мог успеть уйти на печать в тот момент, когда код закрывает приложение. Соответственно из принтера могло ничего не вылезти.. и никакими delay'ями это нормально не решалось. Поэтому пользователь отправлял документ на печать, шел к принтеру, ждал, забирал документ и закрывал word самостоятельно. И хочу заметить по поводу отправки на конвертер pdf. Если от пользователя никаких действий не требуется, то видимость включать не нужно, я полагаю. В коде, который я привел, пользователю выдавался стандартный диалог печати - с выбором принтера, количества копий и т.п., но сам word при это не показывался и не мелькал. Если в процессе конвертации от пользователя ничего не требуется, то не нужно ему ничего кроме конечно результата показывать (от этого еще и скорость работы улучшается). Конечно, если у Вас там что-то очень сложное, то запускайте какой-нить информативный прогрессбар, чтобы люди не скучали |
|