Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.12.2014, 11:26
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию Пакетная печать файлов

Добрый день.
В цикле формируются docx файлы (распаковка как zip архив, парсинг XMLб подмена значений, запаковка обратно в архив),
которые необходимо печатать в порядке их формирования. Файлов много ~ 2000 за 1 прогон.

Сейчас они у меня просто складываются в папку, а потом от туда методично... ПКМ - печать. Сами понимаете...

Как это дело автоматизировать? Я догадываюсь, что нужно использовать что-то вроде
Код:
shellexecute('print', fullfilename, ...)
но возникает проблема с памятью ибо клиенты Word.exe открываются и открываются. Хотелось бы как-то контролировать процесс открытия клиентов WORD.exe

Для начала можно просто ждать пока закроется только что запущенный процесс. Но как получать Handle после ShellExecute экземпляра Word я не разобрался.

Прошу помощи в этом вопросе.
Ответить с цитированием
  #2  
Старый 26.12.2014, 12:09
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 577
Версия Delphi: 6
Репутация: выкл
По умолчанию

Тут, наверное, нужно уже использовать сервер автоматизации Word с вкладки Servers.
__________________
Не стоит путать форумы с богадельнями. © Bargest
Ответить с цитированием
  #3  
Старый 26.12.2014, 12:30
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Uniq!
Как это дело автоматизировать? Я догадываюсь, что нужно использовать что-то вроде
Код:
shellexecute('print', fullfilename, ...)
но возникает проблема с памятью ибо клиенты Word.exe открываются и открываются. Хотелось бы как-то контролировать процесс открытия клиентов WORD.exe
Тебе нужно подключаться к Word-у через "OLE Automation".
Смотри стандартные компоненты TWordApplication, TWordDocument на вкладке Servers.
Примеры, например, здесь:
Delphi и OLE Automation с Word
MS Word вместо QReport

Цитата:
Сообщение от Uniq!
Для начала можно просто ждать пока закроется только что запущенный процесс. Но как получать Handle после ShellExecute экземпляра Word я не разобрался.
Используя ShellExecute нельзя получить Process Handle, но можно его получить используя вместо этого ShellExecuteEx
Ответить с цитированием
  #4  
Старый 27.12.2014, 03:27
Аватар для Kailon
Kailon Kailon вне форума
Активный
 
Регистрация: 06.06.2010
Сообщения: 340
Версия Delphi: 11.3
Репутация: 429
Сообщение

Цитата:
Сообщение от poli-smen
Примеры, например, здесь:
Delphi и OLE Automation с Word
MS Word вместо QReport
Может здесь тоже поможет.
Цитата:
Сообщение от Uniq!
но возникает проблема с памятью ибо клиенты Word.exe открываются и открываются. Хотелось бы как-то контролировать процесс открытия клиентов WORD.exe
Та же проблема у меня.
__________________
Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете.

Последний раз редактировалось Kailon, 27.12.2014 в 03:30.
Ответить с цитированием
  #5  
Старый 27.12.2014, 06:46
Аватар для Alex_4444
Alex_4444 Alex_4444 вне форума
Прохожий
 
Регистрация: 22.12.2014
Сообщения: 14
Версия Delphi: XE5
Репутация: 50
По умолчанию

Копать яму можно отверткой, мастерком или лопатой. Результат будет тот же, но потраченное время и силы - разные.
В Вашем случае будут использованы все инструменты поочередно. Для начала воспользуйтесь функцией CreateProcess. Затем, получив хендл и контроль над выполнением программы, нужно задействовать OLE, чтобы контролировать и обрабатывать ошибки, возникающие при отправки документа на печать. И обязательно связаться с драйвером принтера для контроля и защиты от переполнения очереди печати. Конечно, все ошибки, которые могут возникнуть в процессе, сразу не предусмотреть, но в Вашем случае, когда все это происходит в цикле, просто необходимо избавить себя от простейших ошибочных ситуаций.
Ответить с цитированием
  #6  
Старый 27.12.2014, 14:39
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

А понаписали-то... Собственно весь код будет примерно таким:
Код:
procedure TForm28.Button1Click(Sender: TObject);
Var
  WordApp: OLEVariant;
  i: Integer;
begin
 if not OpenDialog1.Execute then Exit;
 WordApp := CreateOleObject('Word.Application');
 WordApp.WordBasic.DisableAutoMacros;
 for i := 0 to OpenDialog1.Files.Count - 1
 do begin
    WordApp.Documents.Open(OpenDialog1.Files.Strings[i], ReadOnly := True);
    WordApp.ActiveDocument.PrintOut;
    WordApp.ActiveDocument.Close;
    end;
 WordApp.Quit;
 WordApp := Unassigned;
end;
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 05:17.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025