Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.02.11;
Скачать: CL | DM;

Вниз

фоновая печать Word 9.0   Найти похожие ветки 

 
BOB16   (2006-12-18 16:57) [0]

Столкнулся с проблемой с Word"ом из MS Office 2000:
Пользователь работает с DOS-программой в полноэкранном режиме. Программа на Delphi работает без фокуса ввода как менеджер-сортировщик печати. Когда требуется распечатать doc-документ выдаёт через WordOLE.ActiveDocument.PrintOut содержимое на принтер. И вот именно в момент PrintOut DOS-приложение сваливается из полноэкранного режима и во всей красе появляется Рабочий стол - а этого бы не хотелось. Пользователь не должен отвлекаться и забивать голову тем, что кому-то захотелось сейчас распечатать.
Пробовал сделать:
WordOLE.ActiveDocument.PrintOut(BackGround:=True)
но потом когда пытаюсь освободить OLE:
WordOLE...Close(SaveChanges:=False)
выдает на экране табличку: "Нельзя закрыть Word - идёт печать!"
Кстати, Word из MS Office 2002 и далее такую вольность разрешает!
Если печатать: WordOLE.ActiveDocument.PrintOut(BackGround:=False)
то в момент помещения задания в очередь принтера вываливается Рабочий стол...

Кто-нибудь, сталкивался с такими вещами?
Если, надежда побороть это под Office 2000?


 
BOB16   (2006-12-18 17:01) [1]

можно конечно зделать типа:
var
wnd_: HWND;
wnd_:= GetForegroundWindow();
WorkDocument.PrintOut(Background:=False);
SetForegroundWindow(wnd_);

Но не хочется видеть моргание на мониторе...


 
umbra ©   (2006-12-18 18:29) [2]


> но потом когда пытаюсь освободить OLE:
> WordOLE...Close(SaveChanges:=False)
> выдает на экране табличку: "Нельзя закрыть Word - идёт печать!
> "

а печать то проходит? может задание н6е успевает уйти на принтер?


 
BOB16   (2006-12-18 19:19) [3]

Печать ещё не начинается: MS Word 2000 пытается поместить многостраничный документ в очередь принтера(в окошке принтера появляется надпись: "Word - постановка в очередь.."), а я как раз уже "грохаю" документ - он то мне боле не нужен после PrintOut
Мне бы чтобы - картинка с запросом: "Закрытие Word прекратит печать. Закрыть? Да/НЕТ" вообще не появлялась, например, также как MS Excel 2000 делает это молча.


 
umbra ©   (2006-12-18 19:33) [4]

но документ то не напечатается, если ворд закрыть! пока он весь на принтер не уйдет, закрывать документ нельзя.


 
BOB16   (2006-12-18 23:15) [5]

А каким "макаром" можно узнать - что сейчас Word занят именно передачей на принтер задания?
wait .. for
WordOLE.BackgroundPrintingStatus<>0

не устраивает - оно висит до опупения!

Ощущения что Word чего-то ждёт, и большое подозрение -что всего навсего - чтобы юзер сам показал Рабочий стол, т.е. ушёл с окна DOS-приложения (тут же WordOLE.BackgroundPrintingStatus=0 и всё тип-топ).


 
umbra ©   (2006-12-19 11:01) [6]

как говорит мсдн, надо дать операциооной системе шанс обновить значение свойства. Т.е., насколько я понимаю, надо делать примерно следующее:

while WordOLE.BackgroundPrintingStatus <> 0 do
 Application.ProcessMessages;


 
TStass   (2006-12-19 23:32) [7]

Вот с аналогичной бякой столкнулся:
WinWord.DisplayAlerts:=False;
...........
WinWord.ActiveDocument.PrintOut;
Лезут ненужные диалоговые окошки печати.


 
BOB16   (2006-12-20 09:10) [8]

>[6]
Не описал точно процедуру ожидания в [5]

dly_Time:= Time;
repeat
try
  Application.ProcessMessages;
  bkgndPrnSts:= vOLE.BackgroundPrintingStatus;

  if abs(Time-dly_Time)>30/24.0/60.0/60.0 then // 30 секунды ждём..
   bkgndPrnSts:= 0;

except on e:exception do
bkgndPrnSts:= 0;
end; //try

until bkgndPrnSts=0;


именно этот кусок кода висит более 3 минут....


 
umbra ©   (2006-12-20 11:11) [9]

а окно у программы печати есть? судя по всему, она не обрабатывает приходящие сообщения, и поэтому значение св-ва BackgroundPrintingStatus не обновляется. У меня на тестовом приложении следующий код срабатывает без проблем.

procedure TForm1.Button1Click(Sender: TObject);
var
mydoc: variant;
begin
 WordOle := CreateOleObject("Word.Application");
 if VarIsClear(WordOle) then exit;
 try
   mydoc := WordOle.Documents.Add;
   mydoc.Range(0, 0).InsertAfter("blablabla");
   mydoc.PrintOut(Background:=True);
   while WordOle.BackgroundPrintingStatus <> 0 do
     Application.ProcessMessages;
   mydoc.Close(SaveChanges:=False);
 finally
   mydoc := Unassigned;
   WordOle.quit;
   WordOle := Unassigned;
 end;
end;


 
BOB16   (2006-12-20 15:17) [10]

>[9]
Форма висит только в трее в виде иконки.
На TaskBar"e её - нет.

В момент печати - ..Form.Visible= False.
?Может в этом загвоздка


 
umbra ©   (2006-12-20 16:19) [11]

скорее дело в том, что у нее Enabled = false;


 
BOB16   (2006-12-20 18:56) [12]

>[11]
у формы после .PrintOut()
перед BackgroundPrintingStatus
свойство Enabled = True!
Но печать действительно - "железно" висит.
В списке заданий принтера торчит Word Документ - постановка в очередь... Кол-во байт -
и BackgroundPrintingStatus стабильно = 1

Если трассировать программу под Delphi, то
кусок кода >[8] работает в "вечном" цикле,
когда переключиться в Delphi и поставить breakpoint на
bkgndPrnSts:= vOLE.BackgroundPrintingStatus;,
то перед выполнением bkgndPrnSts = 1, а уже после становится равным 0! Получается, что Delphi что-то делает, что
OLE.BackgroundPrintingStatus начинает работать дальше....


 
umbra ©   (2006-12-20 19:26) [13]


> то перед выполнением bkgndPrnSts = 1, а уже после становится
> равным 0!

перед и после чего? и зачем вообще в этом месте нужен try ... except?


 
BOB16   (2006-12-20 21:57) [14]

>[13]
блок try..except нужен на всякий случай, например:
пока висит ожидание в repeat..until кто-то или что-то "валит" vOLE-объект, вывод: ожидание теперь бесполезно- "Server упал.."

Пока что вопрос остаётся: Как хотя бы добится того, чтобы Word отработал и выложил задание на печать и вернул BackgroundPrintingStatus=0 чтобы его можно было потом "грохнуть" без вываливания на Рабочий стол картинки "О невозможности закрыть Word поскольку идёт печать задания"......


 
BOB16   (2006-12-20 21:59) [15]

>[13]
> то перед выполнением bkgndPrnSts = 1, а уже после становится
> равным 0!
перед
bkgndPrnSts:= vOLE.BackgroundPrintingStatus;
и после этого же..



Страницы: 1 вся ветка

Текущий архив: 2007.02.11;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.034 c
15-1169326330
kayman11111
2007-01-20 23:52
2007.02.11
спутник


3-1163606293
AlexWlad
2006-11-15 18:58
2007.02.11
Невозврат значения из Stored Procedure


15-1169071857
DillerXX
2007-01-18 01:10
2007.02.11
На сколько выстрелов обычно хватает глушителя?


8-1150393736
SamProf
2006-06-15 21:48
2007.02.11
Mediaplayer из потока


15-1169285351
Glivera
2007-01-20 12:29
2007.02.11
Посоветуйте бесплатный Прокси сервер