Объект printer

Содержание

Свойство Printer (Принтер)

Применение

Возвращает или задает объект Printer , представляющий принтер, который используется по умолчанию в текущей системе. Значение данного свойства доступно для чтения и записи.

выражение (обязательно). Выражение, возвращающее один из объектов из списка «Применение».

Пример

В следующем примере первый принтер в коллекции Printers становится принтером по умолчанию для системы, а затем возвращаются его имя, сведения о драйвере и порт.

Полноценная «система печати» с использованием объекта Printer.

Интересно, никто не делал полноценную ‘систему печати’ с использованием объекта Printer?! — чтоб с предварительным просмотром, заданием отступов, колонтитулов, выбором принтера, заданием числа копий и т.д. Источник печати — StdPicture ну или файл граф. формата.

Вообще говоря, особо сложного тут ничего, по идее, не должно быть — разве что предварительный просмотр и колонтитулы. Нету времени разбираться — может, у кого есть готовое решение?!

25.07.2010, 15:27

Вывести цену в рублях и копейках с использованием слов «рубль» и «копейка» в соответствующих падежах
Число N вводится с клавиатуры (N 10 02.09.2010, 15:21 2

предпросмотр уже делал.

Visual Basic
Visual Basic
Visual Basic
02.09.2010, 15:48 3

В составе Component One 8.0 есть такая фишка.
Называется VSPrinter, помоему это то, что тебе нужно.
Качнуть дистрибутив можно с их сайта

качай Enterprise, там кроме этого куча всего
вкусненького. Если помнишь мое мыло — черкни письмо
кину кряк.
Удачи!

02.09.2010, 16:11 4
02.09.2010, 16:11
12.09.2010, 23:30 5
13.09.2010, 11:27 6
13.09.2010, 11:44 7

2 Pantalone:
Некрасиво завязываться на Эксель: его на компьютере конечного пользователя вполне может и не быть. Все более или менее серьёзные программные продукты имеют собственную подсистему печати; если экспорт в Эксель и/или Ворд и предлагается — то в большинстве случаев _опционально_.

Я пока обошёлся формированием в HTML, + немного java-скрипта (для поддержки диаграмм и т.п.), и печатаю через ЭУ WebBrowser, просто посылая ему OLECMDID_PRINT.

Хотя нездоровые мысли о создании своей ‘принт-системы’ не покидают )
Но их, наверное, оставлю до перехода на .NET .

Термины и понятия сетевой печати. Установка драйверов, настройка принтеров. Протокол IPP (Internet Printing Protocol).

Системы семейства Windows Server предоставляют богатые возможности совместного использования принтеров, а также средства управления данным процессом.

В системе Windows Server имеются следующие основные возможности управления печатью:

— предоставление совместного доступа к принтерам;

— публикация принтеров в Active Directory для быстрого поиска имеющихся в сети принтеров;

— автоматическая загрузка клиентом с сервера печати драйвера принтера со всеми настройками данного принтера;

— перенаправление порта принтера на другое устройство печати (позволяет быстро восстановить возможности печати при выходе одного из устройств печати из строя);

— создание пула принтеров (привязка одного принтера к нескольким устройствам печати для повышения быстродействия печати);

— привязка нескольких принтеров к одному устройству печати (для более гибкого управления доступом к принтерам);

— печать через Интернет (Internet Printing Protocol).

Термины и понятия сетевой печати

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

Устройство печати (Print device) — физическое устройство, на котором осуществляется вывод информации на бумагу или иные виды носителей;

Принтер (Printer) — объект операционной системы (программный интерфейс между системой и портом);

Порт (Port) — объект системы, связывающий принтер и устройство печати;

Драйвер принтера (Printer driver) — программная компонента, преобразующая информацию из компьютера в набор команд, соответствующий данной модели устройства печати;

Сервер печати (Print server) — компьютер, получающий от приложений, работающих на компьютерах в сети, задания на печать документов;

Очередь печати (Print queue) — очередь документов, ожидающих вывода на устройство печати;

Спулер (Spooler) — компонента системы, которая временно сохраняет на жестком диске сервера документы, содержащиеся в очереди печати.

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

Следует иметь в виду, что все эти термины относятся не только к серверным редакциям системы Windows, но и к Windows 2000/XP Professional, которые содержат в себе службы файлов и печати, но с ограничением на 10 одновременных клиентских подключений.

Установка драйверов, настройка принтеров

Рассмотрим на примерах и обсудим как общие, так и частные вопросы установки и настройки различных компонент сетевой службы печати:

— установка и настройка принтера, предоставление общего доступа к принтеру по сети;

— настройка сервера печати;

— подключение клиентского ПК к серверу печати, загрузка драйверов;

— создание пула принтеров;

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

Напомним, что в нашей учебной конфигурации имеется домен world.ru, в котором установлены два сервера (оба являются контроллерами домена) — DC1 и DC2.

Установка принтера на сервере.

1. Запустим мастер установки принтера на сервере DC1: кнопка «Пуск» — «Принтеры и факсы» — «Установка принтера» — кнопка «Далее».

2. Выберем тип принтера — «Локальный» (если принтер подключен к какому-либо физическому порту сервера и система Windows может определить этот принтер с помощью технологии «Plug and Play», то нужно отметить галочкой соответствующее поле), нажмем кнопку «Далее» (рис. 5.57):

Если выбираем вариант «Сетевой принтер», то нужно будет либо найти принтер в Active Directory, либо указать точный UNC-путь к принтеру в формате «\\server\printer», либо указать путь к принтеру в Интернете, рис. 5.58:

3. Продолжим установку локального принтера. Выберем порт LPT1 (рис. 5.59):

На данном этапе можно создать новый локальный порт и выбрать, например, порт TCP/IP. Таким образом, на данном сервер будет считаться локальным принтер, имеющий свой сетевой адаптер и подключенный к сети по протоколу TCP/IP.

4. Если принтер автоматически не определился системой, то выберем модель принтера из списка, например, HP LaserJet 5Si (можно указать путь к драйверу принтера, нажав кнопку «Установить с диска»), нажмем кнопку «Далее» (рис. 5.60):

5. Введем имя принтера, например, «Printer1», нажмем «Далее» (рис. 5.61):

6. Разрешим сетевой доступ к этому принтеру, нажмем «Далее» (рис. 5.62):

7. Далее можно заполнить необязательные поля «Размещение» и «Комментарий», которые могут оказаться очень полезными, когда на сервере установлено несколько принтеров, нажмем «Далее».

8. Затем система предложит напечатать пробную страницу (мы этот шаг пропустим). Кнопка «Далее» (система при этом скопирует из дистрибутива в системные папки драйвер принтера), кнопка «Готово».

Выполним аналогичную последовательность действий на сервере DC2, выбрав для принтера имя Printer2.

Подключение к сетевому принтеру с клиентского ПК

В качестве клиента будем использовать компьютер DC1. Подключимся с сервера DC1 к принтеру, установленному на сервере DC2. Можно это сделать с помощью того же мастера установки принтера, указав в нужном месте UNC-путь к принтеру в виде «\\DC2\Printer2», а можно просто открыть в командной строке ресурсы сервера DC2 («Пуск» — «Выполнить» — «\\DC2») и подключиться к установленному на сервере принтеру (рис. 5.63).

Еще один вариант — найти в Active Directory принтер, установленный на сервере DC2 и подключиться к нему. Откроем «Пуск» — «Поиск», выберем поиск принтеров, найдем все принтеры в сети и подключимся к притеру Printer2 (Рис. 5.64).

В процессе установки клиентская часть системы выполнит все необходимые подключения и, самое главное, автоматически загрузит с сервера драйвер принтера (если он не был установлен на клиентском компьютере). Все операционные системы на базе технологий Windows NT автоматически загружают драйверы принтера с сервера при подключении к принтеру. Кроме того, при каждом новом подключении, например, при отправке задания на печать, клиент проверяет, не обновилась ли версия драйвера на сервере, и в случае обновления также автоматически загружает к себе обновленный драйвер. Те драйверы, которые содержатся в базе данных драйверов Windows Server 2003, работают только в системах Windows 2000/XP/2003. Драйверы для более ранних систем на базе Windows NT, то их нужно установить на сервере с дискеты или CD, поставляемых производителем принтера.

Общие параметры сервера печати

Откроем папку «Принтеры и факсы», выберем в меню «Файл» пункт «Свойства сервера».

Закладка «Порты». На данной закладке можно изменить настройки какого-либо порта, удалить ненужный порт или добавить новый порт, например, локальный TCP/IP-порт. Заметим, что в качестве локального порта можно указать порт в виде UNC-имени «\\server\printer» (рис. 5.65).

Закладка «Драйверы». На данной закладке можно добавить, обновить или удалить драйвер для какого-либо принтера.

Закладка «Дополнительные параметры». На данной закладке можно указать путь к папке очереди печати (файлу спулинга), отличный от пути по умолчанию. Это целесообразно делать в том случае, если сервер печати предназначен для печати большого объема документов. Не рекомендуется размещать файл спулинга специализированного и очень нагруженного сервера печати на том же жестком диске, что и операционная система и файл подкачки.

Выберем в папке «Принтеры и факсы» нужный принтер, откроем его Свойства.

Закладка «Общие». Кнопка «Настройка печати» — настройка параметров печати (лотки с подачей бумаги, разрешение печати и др.); кнопка «Пробная печать» — печать пробной страницы.

Закладка «Доступ». Управление доступом к принтеру по сети — предоставление или отмена общего доступа, публикация принтера в Active Directory. Кнопка «Дополнительные драйверы» — установка на сервере дополнительных драйверов для различных операционных систем на базе Windows NT.

Закладка «Порты». На этой закладке можно переназначить принтер на другой порт (фактически — на другое устройство печати), если текущее используемое устройство печати вышло из строя. Если отметить поле «Разрешить группировку принтеров в пул», то можно выбрать для данного принтера одновременно несколько портов; в этом случае конкретные документы будут выводиться на печать на том устройстве, которое будет свободно.

Закладка «Дополнительно». Здесь можно настроить расписание, в которое доступен данный принтер (по умолчанию принтер доступен круглые сутки). Если, например, создать на сервере различные объекты принтеров, привязать их к одному и тому же устройству печати, назначить им различное расписание доступности, а на закладке «Безопасность» дать доступ различным группам пользователей, то одно и то же устройство печати будет доступно различным группам пользователей в различное время.

На этой же закладке есть настройки использования очереди печати (файла спулинга), рекомендуем оставить данные настройки без изменений, в системе выбран наиболее оптимальный вариант. Если отметить поле «Сохранять документы после печати», то напечатанные документы не будут удаляться из очереди (их нужно будет удалять вручную). Данный параметр может быть полезен в том случае, если требуется время от времени делать повторную печать документов (без запуска соответствующих приложений) или необходимо ежедневно контролировать, какие документы печатаются на принтере.

Кнопка «Страница-разделитель» позволяет вставлять между документами специальные страницы, которые разделяют документы и, кроме того, позволяют менять режим работы принтера. Шаблоны страниц-разделителей хранятся в файлах с расширением «.sep». В системе имеются 4 стандартных страницы-разделителя:

pcl.sep — переключает принтер в режим печати PCL и печатает страницу-разделитель перед каждым документом;

pscript.sep — переключает принтер в режим печати PostScript, не печатает страницу-разделитель перед документами;

sysprint.sep — переключает принтер в режим печати PostScript и печатает страницу-разделитель перед каждым документом;

sysprtj.sep — печатает страницу-разделитель перед каждым документом с указанием параметров задачи.

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

Закладка «Безопасность» — управление разрешениями на доступ к принтеру.

Закладка «параметры устройства» — настройка параметров устройства печати.

Управление очередью печати

Откроем конкретный принтер в папке «Принтеры и факсы», например, Printer1. В окне принтера будут видны задания, стоящие в очереди печати (рис. 5.66). На рисунке показаны названия документов, состояние документа в очереди, имя пользователя, печатающего данный документ, количество страниц, размер документа, дата и время отправки задания на печать.

Раздел меню «Принтер», кроме настроек принтера, рассмотренных ранее, позволяет выполнять следующие действия с очередью печати:

— «Приостановить печать» — приостановка процесса печати, данное действие может оказаться необходимым для каких-либо действий с устройством печати (например, заправка бумаги);

— «Очистить очередь печати» — удалить все здания из очереди печати.

Раздел меню «Документ» позволяет выполнить такие операции с документами в очереди:

— «Приостановить» — приостановить процесс печати документа;

— «Продолжить» — продолжить печатать документ, печать которого была приостановлена;

— «Перезапустить» — повторный запуск документа на печать;

— «Отменить» — отменить печать документа.

Если щелкнуть двойным щелчком мыши на документе в очереди, то откроется окно свойств печатаемого документа, из которых наиболее важное — «Приоритет», задаваемый в диапазоне от 1 до 99. Если повысить приоритет задания, то оно будет печататься раньше, чем задания с более низким приоритетом (рис. 5.67).

Замечание. При управлении очередью печати бывают случаи, когда документ «зависает» в очереди и не удаляется из нее, особенно если возникли какие-либо ошибки во время печати (рис. 5.68).

Чтобы очистить очередь от таких «зависших» документов, необходимо перезапустить службу «Диспетчер очереди печати» (Spooler).

Протокол IPP (Internet Printing Protocol)

Системы семейства Windows Server поддерживают протокол печати через Интернет (IPP, Internet Printing Protocol), работающий поверх протокола HTTP и позволяющий пользователям подключаться к принтерам, размещенным в сетях Интернет/интранет. Поддержка данной технологии актуальна в больших корпоративных сетях, состоящих из большого числа IP-сетей, в которых не всегда эффективно работают стандартное взаимодействие между пользователем и сервером через вызовы удаленных процедур (RPC, Remote Procedure call).

Установка службы печати через Интернет

Служба печати через Интернет устанавливается достаточно просто, как и большинство других компонент системы Windows Server.

1. Нажмем кнопку «Пуск», далее — «Панель управления» — «Установка и удаление программ» — кнопка «Установка компонентов Windows».

2. Выберем в списке строку «Сервер приложений», но не будем ставить галочку для этой строки, а нажмем кнопку «Состав» (рис. 5.69):

3. Выберем «Службы IIS», не ставя галочку, также нажимаем кнопку «Состав», отмечаем поле «Печать через Интернет» (рис. 5.70), все необходимые компоненты система добавит автоматически. Далее нажимаем нужное количество раз кнопки «ОК», «Далее» и «Готово».

Подключение пользователя и управление заданиями — все эти операции выполняются через Обозреватель Интернета.

1.Для подключения к серверу печати необходимо в строке адреса Обозревателя ввести адрес в формате «http:// /printers». В нашей учебной сети это будет выглядеть как «http://dc1.world.ru/printers» или «http://dc2.world.ru/printers». После подключения увидим веб-страницу сервера печати (рис. 5.71):

2. Щелкнем мышью на ссылке, указывающей на нужный принтер (в примере — Printer2), затем щелкнем по ссылке «Подключить» (эта ссылка выделена жирным шрифтом), система произведет подключение к принтеру, причем драйвер принтера автоматически загрузится и установится на клиентский ПК (рис. 5.72):

3. Теперь принтер подключен на клиентском ПК, и им можно пользоваться для печати документов из любого приложения.

Управление очередью печати

Управление документами в очереди также осуществляется в Обозревателе Интернета. Отправим на печать несколько документов и проверим состояние очереди (рис. 5.73):

В окне Обозревателя мы можем приостанавливать и продолжать печать выбранного документа, отменять печать документа, очищать очередь печати.

Резюме

Первая часть данного раздела описывает управление дисками, разделами и томами, а также структуру файловых систем FAT16, FAT32 и NTFS.

Вторая часть описывает управление доступом к файловым ресурсам: сетевые разрешения, разрешения NTFS, аудит доступа.

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

Четвертая часть посвящена управлению ресурсами сетевой печати: установка принтера на сервере, настройка параметров печати, предоставление общего доступа к сетевому принтеру, подключение клиентов к сетевым принтерам, перенаправление портов принтера, создание пула принтеров, предоставление доступа к сетевым принтерам по протоколу IPP (протокол печати через Интернет).

Задачи сетевого администратора при управлении ресурсами файлов и печати:

— планирование необходимого объема дискового пространства;

— планирование и реализация необходимых дисковых конфигураций (базовые или динамические диски);

— планирование и реализация прав доступа к файловым ресурсам (сетевые разрешения и разрешения NTFS);

— планирование и реализация аудита доступа к ресурсам;

— планирование и реализация механизмов сжатия и шифрования данных;

— планирование и реализация квот пользователей на дисковое пространство;

— анализ степени фрагментации дискового пространства и осуществление дефрагментации в случае необходимости;

— планирование и размещение сетевых принтеров, управление доступом к принтерам, подключение рабочих мест к сетевым принтерам.

Не нашли то, что искали? Воспользуйтесь поиском:

Лучшие изречения: Для студента самое главное не сдать экзамен, а вовремя вспомнить про него. 10040 — | 7504 — или читать все.

188.64.174.135 © studopedia.ru Не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования. Есть нарушение авторского права? Напишите нам | Обратная связь.

Отключите adBlock!
и обновите страницу (F5)

очень нужно

Объект printer

&nbsp&nbsp&nbsp&nbspОдин из наиболее трудных аспектов программирования в Windows — это вывод на принтер. ObjectWindows путем использования ряда модулей и инкапсуляции поведения устройства печати и самой распечатки делает печать более простой.

&nbsp&nbsp&nbsp&nbspДанная глава описывает основы процесса печати, после чего описываются следующие задачи:

  • Построение объекта принтера.
  • Создание распечатки.
    • Печать документа.
    • Печать содержимого окна.
  • Передача распечатки на принтер.
  • Выбор другого принтера.
  • Настройка конфигурации принтера.

Почему печать представляет трудности?

&nbsp&nbsp&nbsp&nbspС одной стороны печать в Windows достаточно проста. Вы можете использовать для генерации распечатки те же функции GDI, что используются для вывода образов на экран. Для вывода текста используется функция TextOut, а для вычерчивания прямоугольника Rectangle.

&nbsp&nbsp&nbsp&nbspС другой стороны, процесс осложняется, так как Windows требует непосредственного «общения» с драйверами принтера через вызовы Escape или получения адреса DeviceMode или ExtDeviceMode. Это еще более осложняется требованием Windows, чтобы приложение считывало имя драйвера устройства из файла WIN.INI. Кроме того, устройства печати обладают большими возможностями проверки допустимости и возможностями разрешения, чем видеоустройства.

&nbsp&nbsp&nbsp&nbspObjectWindows не может преодолеть все препятствия на этом пути, но делает процесс печати более простым и легким для понимания.

Печать в ObjectWindows

&nbsp&nbsp&nbsp&nbspМодуль ObjectWindows OPrinter предусматривает для упрощения печати два объекта — TPrinter и TPrintout. TPrinter инкапсулирует доступ к устройствам печати. Он предоставляет возможность конфигурирования принтера, выводя диалог, в котором пользователь может выбрать нужный принтер, а также установить параметры печати, такие как графическое разрешение или ориентация (горизонтальная и вертикальная) печати.

&nbsp&nbsp&nbsp&nbspTPtintout инкапсулирует задачу печати документа. К принтеру этот объект имеет такое же отношение, как TWindow — к экрану. Рисование на экране выполняется методом Paint объекта TWindow, а печать на принтере — методом PrintPage объекта TPrintout. Чтобы напечатать что-то на принтере, приложение должно передать методу Print объекта TPrinter экземпляр TPrintout.

Построение объекта принтера

&nbsp&nbsp&nbsp&nbspВ большинстве случаев приложению требуется в каждый момент времени доступ только к одному принтеру. Простейшим способом реализации этого является задание в объекте основного окна поля с именем Printer (типа PPrinter), которые другие объекты в программе вызывают для целей печати. Чтобы сделать принтер доступным, поле Printer должно указывать на экземпляр TPrinter.

&nbsp&nbsp&nbsp&nbspВ большинстве приложений это просто. Основное окно приложения инициализирует объект принтера, который использует заданный по умолчанию принтер, указанный в WIN.INI:

&nbsp&nbsp&nbsp&nbspВ некоторых случаях может возникать необходимость использовать в приложении различные принтеры одновременно из различных окон. В этом случае постройте объект принтера в конструкторах каждого такого окна, затем смените устройство принтера на один или более таких принтеров. Если программа использует различные принтеры, но не одновременно, то возможно лучше использовать один и тот же объект принтера и при необходимости выбирать различные принтеры.

&nbsp&nbsp&nbsp&nbspХотя вы можете сомневаться насчет переопределения конструктора TPrinter для использования принтера, отличного от заданного в системе по умолчанию, рекомендуемой процедурой является использование конструктора по умолчанию, а затем смена связанного с объектом устройства. См. раздел «Выбор другого принтера».

Создание распечатки

&nbsp&nbsp&nbsp&nbspПримечание: Графические функции Windows поясняются в Главе 17.

&nbsp&nbsp&nbsp&nbspЧтобы создать объект распечатки, постройте новый тип, производный от TPtintout, который переопределяет PrintPage. В очень простых случаях это все, что требуется сделать. Если документ имеет размер более одной страницы, то вам нужно также переопределить HasNextPage для возврата True. Текущий номер страницы передается в качестве параметра PrintPage.

&nbsp&nbsp&nbsp&nbspОбъект распечатки имеет поля, содержащие размер страницы и контекст устройства, который уже инициализирован для принтера. Объект принтера устанавливает значения, вызывая метод объекта распечатки SetPrintParams. Используйте контекст устройства объекта распечатки в любом вызове графических функций Windows.

&nbsp&nbsp&nbsp&nbspМодуль OPrinter включает в себя два специализированных объекта распечатки, которые показывают диапазон сложности распечаток. Объект TWindowPrintout, печатающий содержимое окна, очень прост. TEditPrintout, который печатает содержимое управляющего элемента редактирования, очень сложен, так как имеет множество возможностей.

Печать документа

&nbsp&nbsp&nbsp&nbspWindows рассматривает распечатку как последовательность страниц, поэтому задачей вашего объекта распечатки является превращение документа в последовательность станичных образов для печати Windows. Аналогично тому как оконные объекты используются для отображения образов на экране дисплея, объекты распечатки используются для печати образов на принтере.

&nbsp&nbsp&nbsp&nbspObjectWindows предусматривает абстрактный объект распечатки TPrintout, из которого вы можете создать производные объекты распечатки. Вам нужно переопределить в TPrintout только несколько методов.

&nbsp&nbsp&nbsp&nbspВаши объекты распечатки должны делать следующее:

  • Устанавливать параметры принтера.
  • Подсчитывать страницы.
  • Отображать каждую страницу в контексте устройства.
  • Указывать, есть ли еще страницы.

&nbsp&nbsp&nbsp&nbspОстальная часть этой главы ссылается на пример программы PrnTest, записанной на ваших дистрибутивных дискетах под именем PRNTEST.PAS. PrnTest считывает текстовый файл в набор строк, а затем по команде печатает документ. Объект PrnTest описывается следующим образом:

Задание параметров печати

&nbsp&nbsp&nbsp&nbspПеред запросом распечатки документа объект принтера предоставляет вашему документу возможность разбивки на страницы. Для этого вызываются два метода объекта распечатки — SetPrintParams и GetDialogInfo.

&nbsp&nbsp&nbsp&nbspФункция SetPrintParams предназначена для инициализации структур данных, которые могут потребоваться для получения эффективной распечатки отдельных страниц. SetPrintParams — это первая возможность вашей распечатки обратиться к контексту устройства и задать для принтера размер страницы. Приводимый ниже фрагмент программы показывает пример переопределенного метода SetPrintParams.

&nbsp&nbsp&nbsp&nbspЕсли вы переопределяете SetPrintParams, убедитесь в вызове наследуемого метода, устанавливающего значения полей распечатки объекта.

Подсчет страниц

&nbsp&nbsp&nbsp&nbspПосле вызова SetPrintParams объект печати вызывает булевскую функцию GetDialogInfo. GetDialogInfo задает информацию, необходимую для вывода на экран диалогового блока, позволяющего пользователю выбрать перед печатью диапазон страниц. В подсчете страниц в GetDialogInfo и индикации вывода диалогового блока имеются два аспекта.

&nbsp&nbsp&nbsp&nbspФункция GetDialogInfo воспринимает единственный параметр-переменную Pages, которую она должна устанавливать в число страниц в документе или в 0, если она не может подсчитать страницы. Возвращаемое значение равно True, если вы хотите вывести диалоговый блок, и False для подавления его вывода.

&nbsp&nbsp&nbsp&nbspПо умолчанию GetDialogInfo устанавливает Pages в 0 и возвращает True, что означает, что она не знает, сколько может получиться страниц, и что перед печатью будет выводиться диалоговый блок. GetDialogInfo обычно переопределяется для установки Pages в число страниц в документе и возвращает True.

&nbsp&nbsp&nbsp&nbspНапример, PrnTest подсчитывает, сколько строк текста выбранного шрифта может поместиться в области печати в SetPrintParams, а затем использует это число для подсчета количества страниц, которые нужно напечатать в GetDialogInfo:

Печать каждой страницы

&nbsp&nbsp&nbsp&nbspКогда объект принтера предоставляет возможность разбивки документа на страницы, то для печати каждой страницы он вызывает метод PrintPage объекта распечатки. Процесс распечатки только части документа, которому принадлежит данная страница, аналогичен определению того, какую часть прокручиваемого окна нужно отображать на экране. Например, можно отметить подобие методов отображения окна и отображения страницы:

&nbsp&nbsp&nbsp&nbspПри написании методов PrintPage следует иметь в виду следующее:

&nbsp&nbsp&nbsp&nbsp* Независимость от устройств. Убедитесь, что в вашем коде не делается предположений относительно масштаба, коэффициента относительного удлинения или цветах. Для различных устройств видеоотображения и печати эти характеристики могут отличаться, так что в программе следует избегать такой зависимости.

&nbsp&nbsp&nbsp&nbsp* Возможности устройств. Хотя большинство видеоустройств поддерживают все операции GDI, некоторые принтеры этого не делают. Например, многие устройства печати (такие как графопостроители) совсем не воспринимают графических изображений. При выполнении сложных задач вывода в программе следует вызывать функцию API Windows GetDeviceCaps, которая возвращает важную информацию о данном устройстве вывода.

Указание оставшихся страниц

&nbsp&nbsp&nbsp&nbspУ объектов распечатки имеется также последняя обязанность указать объекту принтера, имеются ли после данной страницы еще печатаемые страницы. Метод HasNextPage воспринимает в качестве параметра номер строки и возвращает значение Boolean, указывающее, существуют ли еще страницы. По умолчанию HasNextPage всегда возвращает значение False. Чтобы напечатать несколько страниц, ваши объекты распечатки должны переопределять HasNextPage для возврата True, если документ имеет больше страниц для печати, и False, если переданным параметром является последняя страница.

&nbsp&nbsp&nbsp&nbspНапример, PrnTest сравнивает номер последней напечатанной строки с последней строкой в файле и определяет, нужно ли печатать еще страницы:

&nbsp&nbsp&nbsp&nbspУбедитесь, что HasNextPage возвращает в некоторой точке значение False. Если HasNextPage всегда возвращает True, то процесс печати попадет в бесконечный цикл.

Другие соглашения по печати

&nbsp&nbsp&nbsp&nbspОбъекты распечатки содержат также несколько других методов, которые вы можете при необходимости переопределить. Методы BeginPrintint и EndPrinting вызываются, соответственно, перед печатью и после печати любого документа. Если вам требуется специальная установка, вы можете выполнить ее в BeginPrinting и отменить в EndPrinting.

&nbsp&nbsp&nbsp&nbspПечать страниц выполняется последовательно. То есть, для каждой страницы в последовательности принтер вызывает метод PrintPage. Однако, перед первым вызовом PrintPage объект принтера вызывает BeginDocument, передавая номер первой и последней страницы, которые будут печататься. Если для вашего документа при печати страниц, отличных от первой, требуется специальная подготовка, переопределите метод BeginDocument. После распечатки последней страницы вызывается соответствующий метод EndDocument.

&nbsp&nbsp&nbsp&nbspМожет потребоваться также переопределение метода GetSelection. GetSelection указывает в своем возвращаемом булевском значении, имеет ли документ выделенную часть. Если это так, диалоговое окно печати предоставляет вам возможность распечатать только эту выделенную часть. Позицию выделения указывают два параметра-переменных Start и Stop. Например, TEditPrintout интерпретирует Start и Stop как позиции символов, но может представлять также строки текста, страницы и т.д.

Печать содержимое окна

&nbsp&nbsp&nbsp&nbspПоскольку окно не разбивается на несколько страниц, и оконные объекты уже знают, как отображаться в контексте устройства, простейшим видом генерируемой распечатки является копия содержимого окна.

&nbsp&nbsp&nbsp&nbspЧтобы еще более облегчить эту общую операцию, ObjectWindows обеспечивает дополнительный вид объекта распечатки TWindowPrint. Любой оконный объект ObjectWindows может без модификации печатать свое содержимое в объект TWindowPrintout. Объекты распечатки масштабируют образ для заполнения нужного числа страниц и поддерживают коэффициент относительного удлинения.

&nbsp&nbsp&nbsp&nbspСоздание объекта распечатки окна требует только одного шага. Все, что требуется сделать — это построить объект печати окна, передавая ему строку заголовка и указатель на окно, которое требуется напечатать:

&nbsp&nbsp&nbsp&nbspЧасто возникает необходимость в том, чтобы окно само создавало свою распечатку, возможно в ответ на команды меню:

&nbsp&nbsp&nbsp&nbspTWindowPrintout не предусматривает разбивки на страницы. При печати документа вам нужно печатать каждую страницу отдельно, но так как окна не имеют страниц, вам нужно напечатать только один образ. Окно уже знает, как создать этот образ — оно имеет метод Paint. TWindowsPrintout печатается путем вызова метода Paint окна объекта с контекстом устройства печати вместо контекста дисплея.

Вывод распечатки на принтер

&nbsp&nbsp&nbsp&nbspПри наличии объекта принтера и объекта распечатки фактическая печать выполняется достаточно просто, независимо от того, происходит это из документа или из окна. Все, что вам нужно сделать — это вызов метода Paint объекта принтера, передача указателя на порождающее окно и указателя на объект распечатки:

&nbsp&nbsp&nbsp&nbspВ этом случае порождающее окно — это окно, к которому будут присоединены все всплывающие диалоговые блоки (например, состояния принтера или сообщений об ошибках). Обычно это будет окно, генерирует команду печати, такое как основное окно со строкой меню. В процессе печати для предотвращения передачи множественных команд печати это окно запрещается.

&nbsp&nbsp&nbsp&nbspПредположим, у вас есть приложение, основное окно которого является экземпляром TWidGetWindow. В меню этого окна вы можете выбрать команду меню для печати содержимого окна, генерирующую команду cm_Print. Метод реакции на сообщения может иметь следующий вид:

Выбор другого принтера

&nbsp&nbsp&nbsp&nbspКогда у вас в приложении есть объект принтера, вы можете связать его с любым установленным в Windows устройстве печати. По умолчанию TPrinter использует заданный по умолчанию принтер Windows (как это определено в разделе устройств файла WIN.INI).

&nbsp&nbsp&nbsp&nbspСуществует два способа задания альтернативного принтера: непосредственно в программе и через диалоговое окно пользователя.

Выбор принтера пользователем

&nbsp&nbsp&nbsp&nbspНаиболее общим способом назначения другого принтера является вывод диалогового окна, предоставляющего пользователю возможность выбора из списка установленных устройств печати. TPtinter делает это автоматически при вызове его метода Setup. Как показано на Рис. 15.1, Setup использует для этого диалогового окна объект TPrinterSetupDlg.

Рис. 15.1 Диалоговое окно задания принтера.

Настройка конфигурации принтера

&nbsp&nbsp&nbsp&nbspОдна из командных кнопок в диалоге выбора принтера позволяет пользователям изменить конфигурацию конкретного принтера. Кнопка Setup выводит диалоговый блок конфигурации, определенной в драйвере принтера. Ваше приложение не может управлять внешним видом или функциями диалогового блока конфигурации драйвера.

Назначение конкретного принтера

&nbsp&nbsp&nbsp&nbspВ некоторых случаях вам может потребоваться назначить для своего объекта принтера специфическое устройство печати. TPrinter имеет метод SetDevice, который именно это и делает.

&nbsp&nbsp&nbsp&nbspSetDevice воспринимает в качестве параметров три строки: имя устройства, имя драйвера и имя порта.

Публикация принтеров в AD

Механизм объявлений упрощает поиск принтеров

Когда системным администраторам приходится иметь дело с нарушениями в работе принтеров, у большинства из них возникает желание удалиться в серверную комнату и спокойно наблюдать за миганием маленьких цветных лампочек. Принтеры — скучный предмет. Тем не менее возможность отыскать доступные принтеры в Active Directory (AD) — одно из самых очевидных преимуществ, получаемых пользователями при переходе от Windows NT к Windows 2000. Такой поиск становится эффективным благодаря механизму публикации принтеров в AD.

Публикация принтеров

По умолчанию Windows 2000 Server и более поздние версии автоматически публикуют информацию о принтерах в AD. Чтобы проверить, были ли данные о принтерах опубликованы в AD, нужно открыть диалоговое окно Properties принтера, перейти к вкладке Sharing и установить или сбросить флажок List in the Directory (экран 1).

Экран 1. Окно свойств принтера с выбранным флажком List in the Directory

Следует помнить, что информация о принтерах, опубликованная в AD, — это простое описание принтера. В процессе публикации в AD создается объект класса printQueue. Очередь печати является потомком объекта computer, который предоставляет службу принт-сервера. Для просмотра атрибутов объекта print queue (очередь печати) в AD можно использовать такие инструменты, как ADSI Edit или ldp.exe. В табл. 1 приведен пример атрибутов, установленных для принтера Epson DFX-8500. Данная информация полезна, если требуется убедиться, что сведения о принтере опубликованы в AD.

На рабочих станциях Windows XP или Windows 2000 Professional информацию о принтерах можно публиковать в AD с помощью флажка List in the Directory, но эта процедура не автоматизирована. Для большинства организаций возможность публикации принтеров рабочих станций в AD менее полезна, чем публикация принтеров, связанных с принт-серверами, так как принтеры рабочих станций выделяются для конкретных пользователей. Кроме того, рабочие станции часто бывают отключены или по другим причинам недоступны в течение длительного времени.

В AD можно опубликовать и принтеры, связанные с компьютерами NT 4.0 и Windows 9x, но это более трудоемкий процесс. В настройках таких систем отсутствует флажок List in the Directory, поэтому администратор должен сформировать объект print queue вручную (с помощью оснастки Active Directory Users and Computers консоли управления MMC) или используя сценарий pubprn.vbs в папке system32. Более подробно о применении сценария pubprn.vbs рассказано в статье Microsoft «Publishing a Printer in Windows Active Directory» (http://support.microsoft.com/?kb >

Поиск принтеров

Для пользователя главным преимуществом публикации информации о принтерах в AD будет расширение возможностей поиска. Пользователи могут не только отыскивать принтеры в лесу, но и вести детальный поиск по отдельным функциям и характеристикам принтеров. Например, можно будет искать принтеры по имени, местонахождению, модели (если эта информация имеется в AD) и функциональным возможностям устройства (например, цветная или двусторонняя печать). Обращаясь к вкладке Advanced из окна поиска, пользователи могут искать принтеры почти по любым атрибутам объекта print queue, хранящимся в AD.

Для доступа к функции поиска на рабочих станциях XP и Windows 2000 Pro следует выбрать пункты меню Start, Search и Find Printers. В предыдущих версиях Windows таких возможностей не было, но пользователи могут искать принтеры в AD, если на компьютеры установлен Directory Services Client.

Чтобы облегчить задачу пользователей, следует заполнить поле Location для каждого принтера, публикуемого в AD. Проектируя AD, необходимо составить удобное, масштабируемое соглашение об обозначении местоположения устройств. Синтаксис поля Location следующий:

от наиболее общих к наиболее точным указателям места. Например,

обозначает конкретную комнату в швейцарском офисе.

Экран 2. Использование поля Location для поиска принтеров в AD

При использовании поля Location возможны два варианта. Первый из них — просто заполнить поле Location на странице General properties каждого принтера, определенного на принт-сервере. Данный подход позволяет выполнять поиск во всей названной области или ее части (с применением универсального символа — *). При использовании второго, гораздо более эффективного способа также следует заполнить поле Location всех определенных в AD подсетей и активизировать параметр групповой политики Pre-populate printer search location text. При таком подходе пользователи увидят в поле местоположения окна Find Printer готовые данные о своей рабочей станции (экран 2). Рабочая станция получает сведения о местонахождении, сравнивая IP-адрес с подсетями, определенными в AD. Обнаружив совпадение, рабочая станция копирует сведения из поля Location подсети в строку местонахождения окна Find Printer. Более подробная информация об автоматическом заполнении поля Location приведена в материале Microsoft «Best Practices for Deploying Printer Location with Active Directory» (http://www.microsoft.com/windows2000/ technologies/fileandprint/print/addeploy.asp).

Обнаружить принтеры можно и с помощью оснастки Active Directory Users and Computers. Щелкнув правой кнопкой мыши на левой панели, следует выбрать пункт Find, затем Printers из раскрывающегося списка и ввести критерий поиска. Чтобы просмотреть в оснастке объекты print queue под соответствующими родительскими объектами print-server (экран 3), необходимо сначала выбрать пункт Users, Groups and Computers as Containers из меню View.

Поиск неисправностей в Printer Publishing

В Windows 2000 Server и более новых принт-серверах используется протокол LDAP для автоматической публикации в AD информации о принтерах. Как показано на экране 4, SRV-записи DNS объявляют LDAP-службы, работающие на контроллерах домена (DC). Для публикации информации о принтерах принт-сервер ведет поиск ближайшего DC с помощью SRV-записей DNS. С целью повышения производительности принт-сервер пытается опубликовать информацию на ближайшем DC. В распределенной инфраструктуре AD, сайты которой соединены каналами связи с малой пропускной способностью, принт-серверу следует публиковать данные на локальном, а не на удаленном DC. В результате при возникновении неполадок с DNS или если настройки DNS на принт-сервере неверны, на предприятии могут возникнуть проблемы с публикацией принтеров в AD.

Если принтер успешно опубликован в AD, то принт-сервер, выполнивший операцию, записывает в журнал System событие с ID 36, аналогичное показанному на экране 5. С помощью ADSI Edit или ldp.exe можно убедиться, что объект print queue был успешно опубликован в AD и атрибутам присвоены корректные значения (примеры приведены в табл. 1).

Экран 5. Событие ID 36 журнала событий System

Любой компьютер или пользователь, записывающий информацию в AD, должен иметь для этого определенные разрешения. Чтобы успешно создать объекты print queue в AD, родительский объект (то есть принт-сервер) должен иметь разрешения для создания дочерних объектов. Такое разрешение (создавать/удалять дочерние объекты) устанавливается по умолчанию, но если администратор внес какие-либо изменения в стандартные параметры, возможно, придется специально активизировать разрешение для публикации принтеров в AD.

Если принт-сервер не опубликует принтеры после установки флажка List in the Directory, как описано выше, то он продолжит свои попытки. Однако при этом принт-сервер выведет на экран сообщение The Directory operation is still in progress (идет выполнение операции в службе каталога). Это же сообщение может появиться при неполадках, после того как администратор сбросил флажок, чтобы удалить информацию о принтерах из AD. Процесс публикации или удаления принтера занимает всего несколько секунд. Поэтому, если принт-сервер не выполнил эту операцию за несколько минут, значит, возникли неполадки. Следует проверить правильность параметров DNS на клиенте и доступность SRV-записей DNS на контроллере домена. Если причина сбоя все еще не установлена, нужно убедиться, что родительский объект computer имеет разрешения для создания дочерних объектов.

Удаление принтеров

AD автоматически удаляет информацию о принтерах, если очередь печати удалена из принт-сервера. Но что происходит, если принт-сервер неожиданно и безвозвратно удаляется из сети? В этом случае AD не удаляет информацию о принтерах автоматически, так как удаление этих данных — задача принт-сервера. В результате устаревшие объекты print queue могут неопределенно долгое время оставаться в AD. Для решения этой проблемы специалисты Microsoft разработали службу удаления принтеров (printer pruner — она же directory pruning в групповых политиках). В действительности служба удаления принтеров — не отдельная служба Windows, но она работает как поток в процессе спулинга на контроллерах домена.

В определенных условиях результаты работы службы удаления могут быть непредсказуемыми. Иногда в дискуссионных форумах приходится встречать сообщения о том, что некоторые или даже все принтеры исчезли из AD. Как это произошло? Чтобы понять причину проблемы, нужно рассмотреть, как работает служба удаления.

Она работает на всех контроллерах домена AD. Периодически служба связывается с очередью печати сервера, дабы убедиться, что принтеры, опубликованные в AD, все еще присутствуют в сети. Затем служба несколько раз обращается к очереди печати в течение определенного периода времени. Стандартный режим проверок — три обращения с восьмичасовыми интервалами в сутки (интервал можно изменить в разделе Computer Configuration, Administrative Templates, Printers оснастки MMC Group Policy). Если служба удаления не может установить связь с очередью печати в течение заданного периода, то она удаляет объект print queue из AD. Таким образом, используя периодические проверки, служба удаляет принтер из AD в течение 24 часов.

Сначала каждая служба удаления принтеров DC составляет список всех принтеров, опубликованных в AD. Затем с помощью DNS отыскиваются принт-серверы, расположенные в ее собственном сайте AD. После этого служба пытается установить связь с каждой очередью печати на принт-серверах в этом сайте, удаляя объекты print queue из AD.

Проблемы возникают, когда служба не может найти информацию о принт-сервере в DNS и, следовательно, не в состоянии определить, находится ли принт-сервер в том же сайте AD, что и DC. В этом случае служба удаления просто полагает, что принтер находится в том же сайте AD, что и DC, на котором работает служба удаления. Это предположение может вызвать проблемы в том случае, если DC и принт-сервер находятся в разных местах, соединенных медленными сетевыми каналами, или если одно из устройств расположено за брандмауэром. Если DC не может установить связь с очередью печати в течение заданного периода, то служба удаления просто изымает информацию об очереди печати из AD. DC, на котором выполняется удаление, использует стандартную процедуру репликации каталогов для пересылки изменений на все другие DC домена.

Другая проблема связана с клиентской службой DHCP. Как известно, служба DHCP client необходима для динамической регистрации в DNS (DDNS — dynamic DNS). Поэтому, если служба DHCP client на принт-сервере остановлена, сервер не может динамически перерегистрировать хост-адрес (A) и указатель (PTR) ресурсов. По истечении определенного периода времени запись DNS принт-сервера может быть удалена из DNS в процессе уборки «мусора» и устаревших данных. Если запись принт-сервера удалена, то каждая служба удаления принтеров предполагает, что DC, на котором она работает, находится в том же сайте AD, что и принт-сервер. И опять же, если ни один из этих DC не имеет сетевого соединения с принт-сервером, то служба удаления «уберет» принтеры из AD. Важно, чтобы служба DHCP client функционировала на всех принт-серверах в AD, которые работают с DDNS; этой цели можно добиться с помощью групповой политики. Аналогично, если отключить DC от сети на период времени, превышающий заданный период опроса, но при этом DC продолжает работать, то служба удаления принтеров на этом DC удалит все опубликованные принтеры из-за отсутствия связи с ними. Если связь DC с сетью восстанавливается, то удаленная информация будет реплицирована с других DC.

Некоторые записи журнала событий могут быть полезными при диагностике проблем с принтерами, в частности событие с ID 47 в журнале событий System контроллера домена. Это событие, как правило, происходит, когда служба удаления совершает неудачную попытку связаться с очередью печати на принт-сервере. Если вслед за событием с ID 47 в журнале System регистрируется событие с ID 50, значит, предпринято максимальное число попыток и AD удалила объект print queue.

Каким образом эти события помогут обнаруживать неполадки в службе удаления принтеров, можно пояснить на следующем примере. Предположим, администратор замечает, что из AD внезапно исчезли некоторые или все опубликованные принтеры. Если есть основания подозревать наличие неполадок в DNS, то необходимо выяснить, служба удаления какого DC ответственна за удаление принтеров. Вместо того чтобы открывать Event Viewer для каждого DC по очереди, можно воспользоваться утилитой EventCombMT из комплекта ресурсов Microsoft Windows Server 2003 Resource Kit для поиска на контроллерах домена событий с ID 47 и 50. Из графического интерфейса EventCombMT можно отыскать конкретные события в журналах событий заданного круга машин. Утилита записывает итоговую выходную информацию в удобный для просмотра текстовый файл. Отыскав DC, на котором произошла ошибка, можно определить причину неисправности.

При определенных обстоятельствах возникает противоположная проблема: служба удаления не изымает принтеры из AD. Чтобы избежать подобной ситуации, не следует удалять разрешения Print, по умолчанию назначаемые группе Everyone в списке параметров безопасности принтеров на принт-сервере. Если возникает насущная необходимость ограничить доступ к принтеру, то можно удалить разрешения, назначенные группе Everyone, и назначить разрешения Print только группе Domain Controllers. Следует помнить, что службе удаления принтеров, работающей на DC, требуется доступ к очередям печати на принт-серверах. Без минимальных полномочий Print служба удаления не может выполнить своей задачи.

Как правило, принт-сервер повторно публикует информацию о принтерах только в том случае, если на принт-сервере перезапускается служба спулинга. Таким образом, удаленные принтеры не удастся вернуть в AD без вмешательства в какой-либо иной форме. Если принтер удален из списка опубликованных принтеров, то можно очистить этот список, а затем установить флажок List in the Directory на вкладке Sharing в диалоговом окне Properties принтера. Альтернативный подход — изменить параметр Group Policy, чтобы заставить принт-серверы регулярно повторять публикацию информации об очередях печати.

Управление публикацией и удалением принтеров с помощью Group Policy

Политики, связанные с публикацией и удалением принтеров, хорошо документированы в других источниках. В частности, полезные сведения можно найти в материале Microsoft «Integration of Windows 2000 Printing with Active Directory» (http://www.microsoft.com/windows2000/ docs/printad.doc) и в статье «Using Group Policies to Control Printers in Active Directory» (http://support.microsoft.com/?kb >

Стандартные параметры Group Policy вполне приемлемы для большинства сред AD, но если предприятие постоянно сталкивается с проблемами при публикации и удалении принтеров, иногда полезно изменить несколько конкретных политик. Параметры, связанные с печатью и удалением, приведены в разделе Computer Configuration, Administrative Templates, Printers консоли Group Policy (экран 6). При частом неоправданном удалении принтеров (например, из-за сетевых неполадок) я рекомендую сначала попытаться увеличить значение Directory pruning interval. Если это ничего не дает, следует увеличить число попыток Directory pruning retry. Можно также активизировать режим Check published state и установить подходящее значение — 12 часов должно быть достаточно. Последний параметр особенно полезен, так как он заставляет принт-серверы повторно публиковать удаленные принтеры без перезапуска спулера на принт-сервере. Это значение не должно быть слишком малым — частые перезапуски снижают производительность сервера.

Я не рекомендую отключать службу удаления принтеров полностью, так как со временем информация о принтерах в AD может стать неактуальной. Но если это сделать необходимо, следует изменить параметр Allow pruning of published printers, присвоив ему значение Disabled.

Непросто бывает принять решение относительно параметров Group Policy для удаления принтеров, опубликованных вручную. Если разрешить удаление этих принтеров, то время от времени их придется повторно публиковать вручную. Однако если отключить режим удаления этих принтеров, то в конечном итоге в AD почти наверняка появятся «осиротевшие» устройства. Кроме того, исключается возможность использования параметра Check published state, так как данная политика применима только к принт-серверам, способным автоматически публиковать принтеры. Компромиссным решением будет размещение опубликованных вручную принтеров в отдельной, специализированной организационной единице (OU), связанной с политикой, имеющей повышенные относительно типовых значения параметров Directory pruning interval и Directory pruning retry. Кроме того, полезно присвоить параметру политики Allow printers to be published значение No для организационных единиц, содержащих рабочие станции. В результате такой меры флажок List in the Directory становится недоступным.

Рекомендации по работе с механизмом публикации принтеров

Благодаря механизму публикации принтеров, пользователи AD могут быстро и без труда отыскивать расположенные поблизости принтеры. Многочисленные атрибуты печати, хранящиеся в AD, позволяют пользователям задавать точные критерии поиска принтеров с конкретными характеристиками. Для эффективного использования службы Find Printer необходимо тщательно планировать механизмы публикации и удаления принтеров и управлять ими. Особое внимание следует уделить схеме именования в поле Location, так как в основном именно от нее зависит эффективность поиска принтеров пользователями.

Механизмы публикации и удаления принтеров не всегда функционируют безупречно, поэтому необходимо знать принципы работы механизмов, виды неполадок и методы диагностики. К счастью, задача облегчается благодаря таким инструментам, как EventCombMT.

Параметры Group Policy позволяют контролировать большинство функций публикации и удаления. По мере роста и развития среды AD администратору следует время от времени пересматривать политики и вносить в них изменения.

Функции Print() в Python

Функция print Python выводит заданные объекты на стандартное устройство вывода (экран) или отправляет их текстовым потоком в файл.

Полный синтаксис функции print() :

Параметры print()

  • objects – объект, который нужно вывести * обозначает, что объектов может быть несколько;
  • sep – разделяет объекты. Значение по умолчанию: ‘ ‘ ;
  • end – ставится после всех объектов;
  • file – ожидается объект с методом write ( string ). Если значение не задано, для вывода объектов используется файл sys.stdout ;
  • flush – если задано значение True , поток принудительно сбрасывается в файл. Значение по умолчанию: False .

Примечание: sep, end, file и flush — это аргументы-ключевые слова. Если хотите воспользоваться аргументом sep , используйте:

Возвращаемое значение

Функция Python print не возвращает значений; возвращает None .

Пример 1 : Как работает функция print() в Python?

При запуске программы получаем:

В примере, приведенном выше функции print Python 3 , во всех трёх выражениях передаётся только параметр objects , поэтому:

  • Используется разделитель ‘ ‘ — обратите внимание на пробел между двумя объектами в результатах вывода;
  • В качестве параметра end используется ‘n’ ( символ новой строки ). Обратите внимание, что каждое выражение print выводится в новой строке;
  • file — используется файл sys.stdout . Результат выводится на экран;
  • Значение flush — False . Поток не сбрасывается принудительно.

Пример 2: print() с разделителем и параметром end

При запуске программы получаем:

Мы передали в программу, пример которой приведен выше, параметры sep и end .

Пример 3: print() с параметром file

С помощью Python print без перевода строки также можно вывести объекты в файл, указав параметр file :

Код, приведенный выше, пытается открыть файл python.txt в режиме записи. Если файл не существует, программа создаёт файл python.txt и открывает его в режиме записи.

В примере мы передали в параметр file объект sourceFile . Объект-строка ‘ Круто же, правда? ‘ записывается в файл python.txt ( после чего можно открыть его текстовым редактором ).

В конце исполнения программы файл закрывается методом close() .

Данная публикация представляет собой перевод статьи « Python print() » , подготовленной дружной командой проекта Интернет-технологии.ру

Печать с помощью объекта Printer

В Delphi имеется класс печатающих объектов TPrinter, который обеспечивает печать текстов, изображений и других объектов, расположенных на его канве — Canvas (см. разделы выше). На канве объекта типа TPrinter могут размещаться и тексты, и изображения.

Модуль Delphi, именуемый Printers, содержит переменную Printer, являющуюся объектом типа TPrinter. Эта переменная эквивалентна невизуальному компоненту, только отсутствующему в палитре библиотеки. Чтобы использовать Printer, надо добавить модуль Printers в оператор uses вашей программы. Автоматически он не добавляется.

Рассмотрим некоторые свойства и методы объекта типа TPrinter.

Свойство, метод Описание
Canvas Канва Canvas — место в памяти, в котором формируется страница или документ перед печатью. Canvas обладает рядом свойств, включая Pen (перо) и Brush (кисть), которые позволяют вам делать рисунки и помещать на них текст. Подробное описание канвы и методов работы с ней вы найдете в разделе выше.
TextOut Метод канвы, который позволяет посылать в нее текст (см. разделе выше).
BeginDoc Используется для начала задания печати.
EndDoc Используется для окончания задания печати. Фактическая печать происходит только при вызове EndDoc.
PageHeight Возвращает высоту страницы в пикселях.
NewPage Принудительно начинает новую страницу на принтере.
PageNumber Возвращает текущий номер печатаемой страницы.

Предположим, вы хотите напечатать текст, используя печатающий объект. Вы можете написать код вида:

Printer.BeginDoc;Printer.Canvas.ТехtOut(10, 10, ‘Я печатаю через объект Printer’);Printer.EndDoc;

Этот код вызывает печать на канве принтера текста «Я печaтаю через объект Printer», начиная с десятого пикселя слева и десятого сверху. BeginDoc запускает задание на печать. Текст посылается на канву с помощью метода TextOut объекта Canvas. Метод EndDoc вызывает печать текста и останавливает задание на печать.

Если вы хотите напечатать изображение, хранящееся в компоненте Image1 (см. раздел выше), это можно сделать операторами:

Printer.BeginDoc;with Image1.Picture.BitMap do Printer.Canvas.CopyRect(Rect(0, 0, Height, Width), Canvas, Rect(0, 0, Height, Width));Printer.EndDoc;

При печати текста объект Printer не производит автоматического переноса строк и разбиения текста на страницы. Поэтому печать длинных текстов с помощью объекта Printer требует достаточно сложного программирования. Проще это делать, например, загрузкой текста в компонент RichEdit (см. разделе выше) и выполнением его метода Print (см. разделе ранее). Другой возможный вариант — использование описанной в следующем разделе системы QuickReport.

Дата добавления: 2014-12-01 ; просмотров: 462 ; ЗАКАЗАТЬ НАПИСАНИЕ РАБОТЫ

Объект принтера Vb6 Печать

Я хочу использовать принтер (драйвер Windows) для печати японского языка в проекте vb 6.

Мой проект находится в японской среде Windows (ОС — это английский язык, который устанавливает японский регион и родственный язык).

Я использую объект Printer для печати простого строкового типа японского языка, такого как «レ ジ ー ス タ ー», код, подобный

но результатом вывода является набор грязного кода, например «��OEvƒOEƒ | �� [ƒg»

Кто-нибудь, кто смог распечатать японский язык с помощью объекта Vb6 Printer Object на японском языке Windows Envrionment, пожалуйста, помогите мне.

Наконец, найти ключ просто, это немного сложно, но я до сих пор не знаю почему. Просто установите шрифт объекта принтера как «Printer.Font.Charset = 128» (128 для японского)

ATTN: Pls обращает внимание на мой случай, моя ОС — это английский язык с языком и регионом на японском языке.

Работа с принтером

Звонок в фирму, которая занимается ремонтом компьютеров:
— Мой принтер начал плохо печатать!
— Вероятно его надо просто почистить. Это стоит $50. Но для Вас будет лучше, если Вы прочтете инструкцию и выполните эту работу сами.
Клиент, удивленный такой откровенностью спрашивает:
— А Ваш босс знает, что Вы таким образом препятствуете бизнесу?
— На самом деле, это его идея. Мы получаем куда больше прибыли, когда позволяем нашим клиентам сначала самим попытаться что-то отремонтировать.

Delphi имеет стандартный объект для доступа к принтеру — TPRINTER, находящийся в модуле PRINTERS. В этом модуле имеется переменная Printer:Tpinter, что избавляет от необходимости описывать свою. Он позволяет выводить данные на печать и управлять процессом печати. Правда, в некоторых версиях Delphi 1 он имеет «глюк» — не работают функции Draw и StrethDraw. Но эта проблема поправима — можно использовать функции API. Далее приведены основные поля и методы объекта Printers :

  • Aborted: boolean — Показывает, что процесс печати прерван
  • Canvas: Tcanvas — Стандартный Canvas, как у любого графического объекта. Он позволяет рисовать на листе бумаге графику, выводить текст . . Тут есть несколько особенностей, они описаны после описания объекта.
  • Fonts: Tstrings — Возвращает список шрифтов, поддерживаемых принтером
  • Handle: HDS — Получить Handle на принтер для использования функций API (см. Далее)
  • Orientation: TprinterOrientation — Ориентация листа при печати : (poPortrait, poLandscape)
  • PageHeight: integer — Высота листа в пикселах
  • PageNumber: integer — Номер страницы, увеличивается на 1 при каждом NewPage
  • PageWidth: integer — Ширина листа в пикселах
  • PrinterIndex: integer — Номер используемого принтера по списку доступных принтеров Printers
  • Printers: TStrings — Список доступных принтеров
  • Printing: boolean — Флаг, показывающий, что сейчас идет процесс печати
  • Title: String — Имя документа или приложения. Под этим именем задание на печать регистрируется в диспетчере печати
  • AssignPrn(f: TextFile) — Связать текстовый файл с принтером. Далее вывод информации в этот файл приводит к ее печати. Удобно в простейших случаях.
  • Abort — Сбросить печать
  • BeginDoc — Начать печать
  • NewPage — Начать новую страницу
  • EndDoc — Завершить печать.

Особенности работы с TPrinter

  1. После команды BeginDoc шрифт у Canvas принтера сбрасывается и его необходимо задавать заново
  2. Все координаты даны в пикселах, а для нормальной работы необходимы миллиметры (по двум очевидным причинам: очень трудно произвести разметку страницы в пикселах (особенно если необходима точность), и , главное, при изменении разрешающей способности принтера будет изменяться число точек на дюйм, и все координаты «поедут».
  3. У TPrinter информация о принтере, по видимому, определяются один раз — в момент запуска программы (или смены принтера). Поэтому изменение настроек принтера в процессе работы программы может привести к некорректной работе, например, неправильной печать шрифтов True Type.

Определение параметров принтера через API

Для определения информации о принтере (плоттере, экране) необходимо знать Handle этого принтера, а его можно узнать объекта TPrinter — Printer.Handle.

Далее вызывается функция API (unit WinProcs):

Index — код параметра, который необходимо вернуть.

Для Index существует ряд констант :

  • DriverVersion — вернуть версию драйвера
  • Texnology — Технология вывода, их много, основные
  • dt_Plotter — плоттер
  • dt_RasPrinter — растровый принтер
  • dt_Display — дисплей
  • HorzSize — Горизонтальный размер листа (в мм)
  • VertSize — Вертикальный размер листа (в мм)
  • HorzRes — Горизонтальный размер листа (в пикселах)
  • VertRes — Вертикальный размер листа (в пикселах)
  • LogPixelX — Разрешение по оси Х в dpi (пиксел /дюйм)
  • LogPixelY — Разрешение по оси Y в dpi (пиксел /дюйм)

Кроме перечисленных еще около сотни, они позволяют узнать о принтере практически все. Параметры, возвращаемые по LogPixelX и LogPixelY очень важны — они позволяют произвести пересчет координат из миллиметров в пиксели для текущего разрешения принтера.

Пример таких функций:

Данную методику можно с успехом применять для печати картинок — зная размер картинки можно пересчитать ее размеры в пикселах для текущего разрешения принтера, масштабировать, и затем уже распечатать. Иначе на матричном принтере (180 dpi) картинка будет огромной, а на качественном струйнике (720 dpi) — микроскопической.

Я производил печать следующим образом:

Copyright © 2004-2020 «Delphi Sources». Delphi World FAQ

Как упростить процесс печати на Java 1.1 c помощью моделей проектирования

Java 1.1 и последующие версии предлагают несколько простых методов печати, которые можно вызвать из Java-приложений. Пока еще модели безопасности Java не позволяют вывести на принтер апплеты Web-страниц, однако, будущие версии Java, возможно, снимут это ограничение.

Сначала мы рассмотрим относительно примитивные методы печати, которые предлагает Java, а затем изучим технологию объектно-ориентированного программирования. Знание данной технологии позволит вам построить более полезный и надежный объект Printer.

Основы печати на Java

Java 1.1 представляет класс PrintJob и дополнительный метод print(Graphics g) класса Container, которые образуют систему печати. Вы получаете объект класса PrintJob из класса Toolkit, взятого из класса Frame.

PrintJob pj = getToolkit().getPrintJob(frm, «printing», null);

Первым аргументом является фрейм приложения, вторым — любое имя задания для печати, а третьим — либо объект класса Properties, либо null. Поскольку система печати на Java не поддерживает никакие свойства, поэтому в качестве объекта вполне можно использовать null.

Класс PrintJob включает следующие методы:

end() Заканчивает процесс печати и выполняет необходимую чистку.
finalize() Заканчивает процесс печати, как только к нему перестают поступать обращения.
getGraphics() Получает объект Graphics , который изображается на следующей странице.
getPageDimension() Возвращает размеры страницы в пикселах.
getPageResolution() Возвращает разрешение страницы в пикселах на дюйм.
lastPageFirst() Возращает «true» («истинно») , при условии что последняя страница печатается первой.

Простая программа печати

Самой простой программой печати является та, которая:

  1. Создает фрейм;
  2. Получает объект PrintJob;
  3. Получает объект принтера Graphics;
  4. Передаёт данные для печати объекту принтера Graphics;
  5. Удаляет объект принтера Graphics, что приводит к выбросу страницы;
  6. Завершает процесс печати.

Пример подобной программы приводится далее:

import java.awt.*;
class helloPrinter extends Frame
<
public helloPrinter()
<
//get the print job
PrintJob pjob = getToolkit().getPrintJob(this, «Printer», null);
Graphics pg = pjob.getGraphics(); //get the graphics
print(pg); //print something
pg.dispose(); //end the page
pjob.end(); //end the job
System.exit(0); //and quit
>
//——————————————
public void print(Graphics g)
<
g.setFont(new Font(«SansSerif», Font.PLAIN, 12));
g.drawString(«Hello Printer», 100, 100);
>
//——————————————
static public void main(String argv[])
<
new helloPrinter();
>
>

Данная программа поможет нам создать больше общих классов печати:

  1. Задание на печать должно создаваться во фрейме. Поэтому задания на печать почти всегда являются визуальными приложениями.
  2. Когда вы создаете класс PrintJob, появляется системный диалог принтера; после чего вы можете выбрать тип принтера и желаемое количество копий.
  3. Хотя задание на печать создается во фрейме, необязательно чтобы данный фрейм был визуальным или имел ненулевой размер.
  4. Прежде чем отправлять текст на принтер, вы должны выбрать шрифт.
  5. Процесс печати происходит путем передачи данных объекту принтера Graphics.
  6. Каждая страница распечатывается сразу и имеет свой собственный объект Graphics. А метод dispose() позволяет распечатать страницу до конца.

Недостатки простых способов печати

Данная простая программа печати выглядит достаточно примитивно. Мы должны печатать каждую строку текста, в конце каждой строки ставить символ переноса, сами задавать шрифт, а также задавать каждую страницу отдельно. Мы бы предпочли создать более функциональный объект Printer, который мог бы сам задавать, хотя бы, типы шрифтов и конец строки. К тому же, хотелось бы, чтобы этот процесс был от нас скрыт.

Класс Printer

Даже если мы будем создавать свой класс Printer, он должен находиться во фрейме. Им может быть любой контейнер, который мы можем добавить во фрейм, а не столько фрейм сам по себе. Мы будем создавать объект printer путем наследования его от класса Canvas. Как правило, данный объект Canvas будет невизуальным и минимального размера: 1 x 1 пиксел. Так как мы собираемся выводить наши данные в объект Graphics, содержащийся внутри данного объекта canvas, у нас появляется возможность создать метод предварительного просмотра страницы (практически без дополнительного кодирования) путем отображения объекта Canvas и вызова метода paint.

Создание класса Printer
Итак, давайте рассмотрим, что мы хотим, чтобы данный класс выполнял. Мы хотели бы иметь возможность печатать обычные строки, строки с возвратом каретки, изменять шрифты, печатать колонки, которые организуются с помощью символов табуляции. Кроме того, было бы неплохо иметь возможность предварительного просмотра текста, выводимого на печать.

В идеале, мы хотели бы, чтобы объект Printer выполнял больше функций, к примеру, организация текста в более, чем одну колонку, даже если мы будем печатать его последовательно. Чтобы пользоваться данной возможностью, наша модель должна предусматривать хранение в объекте Printer элементов печатаемой страницы, до тех пор пока данная страница не будет закончена; а затем распечатать их все сразу. Те же требования предъявляются и к возможности предварительного просмотра страницы.

Методы класса Printer
Нам нужно иметь возможность печатать и переходить на новую строку. Поэтому нам нужен как метод print, так и метод println:

Кроме того, мы хотели бы задавать новые шрифты:

и иметь возможность перемещаться по символам табуляции:

Кроме того, нам нужно переходить на новые страницы, не создавая новый объект для каждой страницы:

И, конечно же, нам нужно, чтобы процесс печати закончился там, где мы его закончили:

Теперь давайте рассмотрим, как мы можем реализовать эти методы так, чтобы можно было хранить различные комманды внутри объекта printer и «проигрывать их», когда мы выводим их на печать или предварительно просматриваем на экране.

Далее, если мы будем продолжать расширять этот объект printer, мы хотели бы иметь возможность представлять графические линии и изображения.

Вектор распечатываемых объектов
Каждый раз когда нам нужно сохранить неопределённое количество объектов, первое, что приходит в голову, — это использовать класс Vector.

Но какие объекты мы будем сохранять и как мы можем проверить, который из них будет печататься следующим? Предположим, что у нас есть объекты String, Font и NewLine, которые хранятся в классе Vector.

Если бы нам нужно было их распечатать, нам бы пришлось определить тип объекта, а затем вызвать для этого типа соответствующий метод:

Это не только плохо читаемо, но более отвечает процедурному программированию, чем объектно-ориентированному. Вместо нескончаемой цепочки if-блоков, которые у нас имеются, давайте попытаемся создать серию объектов, которые сами знают, как себя распечатать или нарисовать.

Класс printerObject
Если мы хотим иметь возможность изобразить каждый объект соответствующим ему образом, мы должны создать класс для распечатываемого объекта, в котором есть метод draw. Мы сообщаем ему, на поверхности какого объекта Graphics нужно рисовать и с каких координат начать рисование:

Затем мы наследуем конкретные объекты данного класса от абстрактного класса, каждый из которых будет выполнять метод draw по-разному. Преимущество данного приема заключается в том, что нам больше не нужно будет проверять тип объекта: каждый объект (String, Font или NewLine) уже имеет соответствующий ему метод draw.

Принцип моделей проектирования
В принципе, если мы рассмотрим всё это с точки зрения Моделей Проектирования, мы обнаружим, что каждый из этих объектов, в действительности, является классом Command. Мы просто назвали данный метод draw, а не Execute, хотя принципиальной разницы это не имеет.

К тому же, так как мы создаем и добавляем различные распечатываемые объекты, мы, фактически, используем объект Printer как класс Factory, генерирующий один из трех различных типов классов printerObject в зависимости от действия, которое нам нужно выполнить.

После этого мы можем распечатать весь список объектов путем перемешения по вектору и вызова метода draw соответствующего printObject.

Нужно отметить, что при получении общих объектов из класса Vector и преобразовании их к типу printerObjects, нам не обязательно знать, какой объект мы в данный момент печатаем: у каждого из них есть свой метод draw.

Классы printObject

Каждый из этих классов содержит метод draw, работающий с объектами Graphics и Point, которые мы ему передаём.

Каждый из этих классов может иметь свой собственный конструктор для передачи различной информации, поскольку мы не определили конструктор при описании нашего абстрактного класса.

Класс printString
Данный класс печатает строку с точки, определённой координатами «x» и «y», а затем устанавливает координату «x» за окончание строки:

Отметим, что поскольку точка начала отображения передаётся как объект Point, а не парой координат «x», «y», она передаётся ссылкой, и любое изменение координаты «x» приводит к изменению объекта Рoint в вызывающей программе.

Класс newLine
Чтобы переместиться на следующую строку, нам нужно определить высоту текущего шрифта, увеличить координату «y» на эту величину и установить координату «x» в левое крайнее положение или в ноль.

Класс setFont
Возможность установки нового шрифта при «проигрывании» класса Vector означает, что мы выполняем метод draw, используя простой метод setFont.

В дополнение к этому, если данный шрифт находится в верхней части страницы, где координата «y» равняется 0, мы продвигаем эту координату на высоту шрифта, поскольку шрифты рисуются снизу вверх.

Класс printTab
Данный класс продвигает координату «x» на расстояние, равное установленной нами ширине символов. Возникает вопрос: какие символы и какой размер шрифта мы будем использовать? Вот ответ: пока мы последовательно выполняем задание на печать, то, как мы определяем ширину одного символа табуляции, особого значения не имеет.

Чтобы убедиться в том, что используется только один размер во всех объектах класса printTab, мы делаем переменную tab_width статической переменной.

Только таким образом все копии данного класса будут автоматически ссылаться на одно и то же значение. Мы устанавливаем его, если оно равно нулю, по умолчанию, равным ширине символа «W» в шрифте, который мы задаём в конструкторе. Как только данное значение установлено, этот код больше не выполняется.

Распечатка «n» символов табуляции равносильно перемещению координаты «x» на расстояние «n», умноженное на ширину табуляции.

Если координата «x» прошла эту точку, мы ничего не делаем. С другой стороны, мы можем продвинуться на одну строку и переместиться к положению табуляции на новой строке.

Методы класса Printer

Теперь, когда мы определили printerObjects, которые мы будем применять, легко проследить, как объект Printer будет их использовать. Мы просто создаём новый экземпляр каждого типа printerObject и добавляем его в vector:

Кроме данных методов печати, нам нужны методы newPage и endJob. Метод newPage фактически выполняет всю работу. Он вызывает метод print(g), который проходит через весь список printerObjects и вызывает их методы draw().

Метод endJob() завершает PrintJob. Если вы игнорируете этот метод, вы можете также закончить PrintJob, вызвав его в методе finalize().

Предварительный просмотр печатаемой страницы

С помощью объекта Printer, который мы только что создали, отобразить всю страницу на экране не представляет труда: просто нам нужно вызвать тот же метод print(g), используя объект Graphics экрана вместо объекта Graphics принтера. Откуда мы получаем объект graphics экрана? Мы берем его из стандартного метода paint(), который мы, в свою очередь, используем для вызова метода печати.

Программа печати

Данная программа создаёт маленькое окно 100 x 100 с двумя кнопками: Show и Plot. Также создаётся объект Printer и добавляется во фрейм. Затем печатаются три строки текста тремя различными шрифтами с помощью табуляции в объекте Printer. Когда вы нажимаете на кнопку Print, он отправляет эти строки на принтер, который вначале вызывает системный диалог принтера (Windows или другой операционной системы); а затем печатает страницу.

Когда вы нажимаете на кнопку Show, окно расширяется до размеров страницы, полученных от PrintJob, и отображает текст.

Установка размеров страницы
Метод getPageDimension() класса PrintJob может работать только при условии, что объект класса PrintJob уже создан. Так как для этого вы можете нажать кнопку «Show», мы предлагаем обходной путь, когда не надо создавать класс PrintJob, если таковой еще не существует, поскольку всякий раз при создании этого класса будет вызываться системный диалог печати. Это вызывает неудобства, если вы хотите просто просмотреть текст. Для страницы 8 x 11 дюймов по умолчанию метод getPageDimension() возвращает размер 620 x 790 пикселов. Заметьте, что размер в пикселах, не имеет ничего общего с разрешением принтера. Он просто возвращает пару чисел, пропорциональных размерам страницы, чтобы дать вам возможность разместить текст внутри данной страницы. Предлагаемый нами подход предназначен для получения этих значений напрямую, пока не создан класс PrintJob:

Законченная программа печати

Мы уже обсудили некоторые части программы печати и сам класс Printer. Законченная программа приводится ниже. Она действительно довольно проста по сравнению с теми объяснениями, которыми она сопровождалась.

Резюме

В данном документе мы рассмотрели различные методы печати на Java. Сначала мы ознакомились с самой простой программой печати, затем создали класс печати, который использует как мод

Илон Маск рекомендует:  Продвижение интернет-магазинов
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL