В процессе программирования на Delphi или Pascal может возникнуть необходимость получить настройки драйвера принтера, в частности, узнать, включено ли коллатирование. Коллатирование – это процесс сортировки страниц в печатных документах для правильного их порядка на выходе. В данной статье мы рассмотрим, как получить настройки драйвера принтера и определить, включено ли коллатирование, используя Windows API.
Проблема
Разработчик столкнулся с проблемой, когда программное обеспечение, написанное на Delphi XE2, не соблюдало настройки коллатирования в драйвере принтера, в отличие от версии, созданной в Delphi 6. Пользователям не разрешено менять настройки коллатирования, так как они принудительно установлены системными администраторами. Требуется найти способ определить, включено ли коллатирование в драйвере принтера, чтобы можно было принудительно установить настройки в QuickReport и добиться правильного коллатирования документов на указанном принтере.
Решение
Для получения настроек драйвера принтера и определения, включено ли коллатирование, можно воспользоваться функциями Windows API OpenPrinter и GetPrinter. При вызове функции GetPrinter передайте запись PRINTER_INFO_2, которая будет возвращена с членом pDevMode, установленным в запись DEVMODE. В этой записи DEVMODE есть флаг, указывающий, включено ли коллатирование.
Ниже приведен пример кода на Object Pascal (Delphi), демонстрирующий обновление настроек принтера для их сохранения, но включающий использование OpenPrinter, GetPrinter, ClosePrinter и PRINTER_INFO_2, а также использование записи DEVMODE (обозначаемой как hDevMode в коде ниже). Этот пример поможет вам начать работу с получением настроек драйвера принтера:
procedure MakePrintersettingsPermanent;
var
hPrinter: THandle;
Device: array[0..255] of char;
Driver: array[0..255] of char;
Port: array[0..255] of char;
hDeviceMode: THandle;
pDevMode: PDeviceMode;
bytesNeeded: Cardinal;
pPI: PPrinterInfo2;
Defaults: TPrinterDefaults;
retval: BOOL;
begin
Assert(Printer.PrinterIndex >= 0);
Printer.GetPrinter(Device, Driver, Port, hDeviceMode);
FillChar(Defaults, SizeOf(Defaults), 0);
Defaults.DesiredAccess := PRINTER_ACCESS_ADMINISTER or PRINTER_ACCESS_USE;
if not WinSpool.OpenPrinter(@Device, hPrinter, @Defaults) then
RaiseLastWin32Error;
try
retval := WinSpool.GetPrinter(
hPrinter,
2,
Nil, 0, @bytesNeeded);
GetMem(pPI, bytesNeeded);
try
retval := WinSpool.GetPrinter(
hPrinter, 2,
pPI, bytesNeeded, @bytesNeeded);
If not retval then
RaiseLastWin32Error;
pDevMode := GlobalLock(hDeviceMode);
Assert(Assigned(pDevMode));
try
Move(pDevMode^, pPI^.pDevMode^, SizeOf(pDevMode^));
finally
GlobalUnlock(hDeviceMode);
end;
If not WinSpool.SetPrinter(
hPrinter, 2,
pPI,
0) Then
RaiseLastWin32Error;
finally
FreeMem(pPI);
end;
finally
WinSpool.ClosePrinter(hPrinter);
end;
end;
Чтобы определить, включено ли коллатирование, проверьте значение поля dmCollate в записи pPI.pDevMode. Если это значение равно TRUE, то коллатирование включено.
Альтернативный ответ
В качестве альтернативного подхода можно рассмотреть использование функции Windows API DeviceCapabilities, передавая ей параметр DC_COLLATE. Эта функция возвращает информацию о возможностях принтера, в том числе о поддержке коллатирования. Однако, как отметил автор вопроса, эта функция не указывает, включено ли коллатирование в драйвере принтера, а только сообщает, поддерживает ли принтер эту функцию.
Заключение
В данной статье мы рассмотрели, как получить настройки драйвера принтера и определить, включено ли коллатирование, используя функции Windows API OpenPrinter и GetPrinter. Пример кода на Object Pascal (Delphi) демонстрирует, как работать с этими функциями и получать записи DEVMODE, содержащие информацию о настройках коллатирования. Знание этих функций поможет разработчикам программного обеспечения на Delphi и Pascal правильно обрабатывать настройки коллатирования в драйверах принтеров.
Данный текст описывает процесс получения настроек драйвера принтера и определения, включено ли коллатирование, используя функции Windows API в программировании на Delphi или Pascal.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS