Текущий архив: 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.49 MB
Время: 0.042 c