Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2007.02.11;
Скачать: [xml.tar.bz2];

Вниз

фоновая печать 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.04 c
4-1159267238
tst
2006-09-26 14:40
2007.02.11
приклеить дополнительную форму


15-1169092383
Тензор
2007-01-18 06:53
2007.02.11
Что такое матрица инерции в ODE ?


2-1169736265
АК
2007-01-25 17:44
2007.02.11
"умное связывание" компилятора


1-1166031886
transp
2006-12-13 20:44
2007.02.11
Панель без "отрисовки"


3-1163790175
F33l
2006-11-17 22:02
2007.02.11
всплывающее окно с картинкой в cxGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский