2009-10-21 3 views
1

Я пишу программу с использованием Delphi 2006 и сохраняю данные в файлах XML и базе данных Firebird. Я создаю отчеты, используя FastReports, Excel или QuickPDF. Я разрешаю своим пользователям собирать несколько отчетов вместе и направлять их в пункт назначения по своему выбору, будь то файл PDF, принтер, экран или электронная почта.Сохраните параметры настройки принтера

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

Я знаю, что разные принтеры имеют разные возможности настройки. Например, тот, который я использую, позволит мне выбрать для печати буклет, чтобы вы могли создать буклет 5 1/2 X 8 1/2 из отчета. Возможно, пользователь может выбрать такой вариант, когда он настраивает отчет в своем пакете и ожидает, что отчет будет печататься таким образом. Вероятно, есть много возможностей, о которых я не знаю, но хотел бы разрешить, если это возможно. Я просто не знаю, как захватить эту конфигурацию из диалогового окна принтера, сохранить ее в базе данных и затем использовать эту информацию для настройки принтера, когда пришло время распечатать отчет.

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

Благодарим за помощь.

ответ

0

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

0

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

--jeroen

2

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

Функция GetPrinterDataEx() API Jeroen не будет работать, поскольку она требует, чтобы вы заранее знали имя ключа реестра, который использовался для хранения информации с помощью процедуры SetPrinterDataEx(), и которая может или может не использоваться драйвером принтера. Если он был использован, вам придется вручную посмотреть на реестр, чтобы узнать, где издатель драйверов решил сохранить информацию; Я подозреваю, что это зависит от производителей принтеров.

FOLLOWUP: Я просто проверил быструю проверку, и я уверен, что это правильно. Если я использую диалоговое окно «Настройка принтера» из приложения Delphi для доступа к настройкам принтера (например, настройке дуплекса перед запуском отчета), никаких изменений в реестре не записывается. Однако, если я зашел в апплет панели управления и изменил настройки там, реестр будет обновлен. Это, похоже, подтверждает, что выбор параметров для каждого отчета, сделанный «на лету» пользователем, будет трудно сохранить, поскольку они, вероятно, недоступны нигде, кроме драйвера принтера. Пользовательские настройки типа (те, что сделаны в апплете панели управления) сделаны пользователем, и пользователь делает выбор, чтобы сделать их постоянными на общесистемной основе, и поэтому они сохраняются в реестре. Это, по-видимому, предотвращает сохранение этих типов параметров для каждого отчета, по крайней мере, из диалогового окна настройки принтера.

+0

Спасибо, Кен. Наверное, я могу перестать бороться с этим. – jrodenhi

+0

Я верю, что прочитал, что я могу запросить диалоговое окно принтера для некоторых конкретных свойств, таких как печать в дуплексе или в каком бункере для использования и т. Д., Сохранить их в моей собственной структуре и настроить принтер во время печати чтобы соответствовать этим свойствам. Это соответствует вашему пониманию? – jrodenhi

+0

Я думаю, вы можете это сделать. Комментарий с кодом из моего приложения, которое опубликовано. – mj2008

0

В документации для Windows API PRINTDLGEX Structure могут содержаться некоторые подсказки.В частности, я думаю, что дескриптор hDevMode предоставляет вам биты, специфичные для драйвера принтера, даже если они недокументированы. Я не знаю, как вы будете использовать эту информацию из Delphi.

2

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

Ознакомьтесь со следующими функциями Windows API. Если вам нужен код C для этого, спросите в комментарии. На самом деле, я скопирую кусок кода, который я использую, жаль, что он не переведен в Delphi! Это из реального рабочего кода, хотя и тяжело сражался. Надеюсь, это даст вам некоторые подсказки.

bGood = OpenPrinter(pcDeviceName, &hPrinter, NULL); 
int sBuffSize = DocumentProperties(hDlg, hPrinter, pcDeviceName, NULL, NULL, 0); 
PDEVMODE pxDevMode = (PDEVMODE)malloc(sBuffSize); 
gl_memset(pxDevMode, '\0', sBuffSize); 
pxDevMode->dmSize = sBuffSize; 
DocumentProperties(hDlg, hPrinter, pcDeviceName, pxDevMode, pxDevMode, DM_PROMPT | DM_COPY); 
DocumentProperties(hDlg, hPrinter, pcDeviceName, pxDevMode, NULL, DM_COPY); 
DocumentProperties(hDlg, hPrinter, pcDeviceName, pxDevMode, pxDevMode, DM_PROMPT | DM_COPY); 
DocumentProperties(hDlg, hPrinter, pcDeviceName, pxDevMode, pxDevMode, DM_UPDATE | DM_MODIFY); 
ClosePrinter(hPrinter); 
+0

Извините. Несколько дней я был вне города. OK. Я чувствую, что, может быть, я немного поспешил принять отказ за ответ. То, что вы говорите, это то, что я надеялся услышать. Я буду продолжать работать над этим. Спасибо за код. Похоже, я смогу сделать из него какой-то работоспособный код Delphi. Если я получу где-нибудь, я отправлю его сюда. Jack – jrodenhi

Смежные вопросы