Передача параметров принтера и бумаги в диалоге печати Delphi VCL
Введение
При работе с печатью в Delphi VCL-приложениях часто возникает необходимость предварительно настроить параметры принтера и бумаги перед отображением стандартного диалога печати. В этой статье мы рассмотрим, как правильно передавать эти параметры, чтобы они корректно отображались в диалоговом окне.
Основные компоненты для работы с печатью
Delphi предоставляет несколько компонентов для работы с печатью:
TPrintDialog - стандартный диалог печати
TPrinterSetupDialog - диалог настройки принтера
TPrinter - основной класс для работы с принтером
Передача параметров принтера
Для передачи параметров принтера перед открытием диалога необходимо работать с объектом Printer (из модуля Printers):
uses Printers;
procedure TForm1.ButtonPrintClick(Sender: TObject);
begin
// Устанавливаем параметры принтера перед открытием диалога
Printer.PrinterIndex := Printer.Printers.IndexOf('Имя принтера');
// Устанавливаем ориентацию страницы
Printer.Orientation := poLandscape; // или poPortrait
// Открываем диалог печати
if PrintDialog1.Execute then
begin
// Код для печати
end;
end;
Настройка параметров бумаги
Для настройки параметров бумаги используем свойства PageWidth и PageHeight объекта Printer:
procedure TForm1.SetupPrinterParams;
begin
// Проверяем, доступен ли принтер
if Printer.Printers.Count = 0 then Exit;
// Устанавливаем принтер по умолчанию
Printer.PrinterIndex := -1; // Принтер по умолчанию
// Устанавливаем параметры бумаги
Printer.PageWidth := 2100; // ширина в десятых долях миллиметра (A4)
Printer.PageHeight := 2970; // высота в десятых долях миллиметра (A4)
// Можно также использовать стандартные размеры бумаги
Printer.PaperSize := DMPAPER_A4;
end;
Использование TPrinterSetupDialog
Для более тонкой настройки параметров принтера и бумаги можно использовать компонент TPrinterSetupDialog:
procedure TForm1.ButtonPrinterSetupClick(Sender: TObject);
begin
// Сначала устанавливаем нужные параметры
SetupPrinterParams;
// Затем открываем диалог настройки
if PrinterSetupDialog1.Execute then
begin
// Параметры сохранены, можно продолжить
end;
end;
Передача параметров в TPrintDialog
Чтобы параметры отображались в диалоге печати, их нужно установить перед вызовом Execute:
procedure TForm1.ButtonPrintClick(Sender: TObject);
begin
// Устанавливаем параметры
Printer.Orientation := poLandscape;
Printer.PaperSize := DMPAPER_A3;
// Настраиваем диалог
PrintDialog1.Options := [poPageNums, poWarning];
PrintDialog1.FromPage := 1;
PrintDialog1.ToPage := 5;
PrintDialog1.MinPage := 1;
PrintDialog1.MaxPage := 10;
if PrintDialog1.Execute then
begin
// Печать с выбранными параметрами
PrintDocument;
end;
end;
Работа с DEVMODE
Для более сложных настроек можно использовать структуру DEVMODE:
uses Winapi.Windows, Winapi.WinSpool;
procedure TForm1.AdvancedPrinterSetup;
var
Device: array[0..255] of Char;
Driver: array[0..255] of Char;
Port: array[0..255] of Char;
hDeviceMode: THandle;
pDevMode: PDeviceMode;
begin
// Получаем текущие настройки принтера
Printer.GetPrinter(Device, Driver, Port, hDeviceMode);
if hDeviceMode <> 0 then
begin
pDevMode := GlobalLock(hDeviceMode);
try
// Устанавливаем параметры через DEVMODE
pDevMode^.dmFields := pDevMode^.dmFields or DM_PAPERSIZE or DM_ORIENTATION;
pDevMode^.dmPaperSize := DMPAPER_A4;
pDevMode^.dmOrientation := DMORIENT_LANDSCAPE;
// Можно установить и другие параметры
pDevMode^.dmCopies := 2;
pDevMode^.dmCollate := DMCOLLATE_TRUE;
finally
GlobalUnlock(hDeviceMode);
end;
// Устанавливаем новые параметры
Printer.SetPrinter(Device, Driver, Port, hDeviceMode);
end;
end;
Альтернативный подход: использование TPrintDialog напрямую
Можно также работать с диалогом печати напрямую через Windows API:
procedure TForm1.CustomPrintDialog;
var
PrintDlg: TPrintDlg;
pDevMode: PDeviceMode;
hDevMode: THandle;
begin
ZeroMemory(@PrintDlg, SizeOf(PrintDlg));
PrintDlg.lStructSize := SizeOf(PrintDlg);
PrintDlg.hwndOwner := Handle;
PrintDlg.Flags := PD_ALLPAGES or PD_RETURNDEFAULT or PD_RETURNDC;
// Получаем DEVMODE по умолчанию
if PrintDlg(PrintDlg) then
begin
hDevMode := PrintDlg.hDevMode;
pDevMode := GlobalLock(hDevMode);
try
// Модифицируем параметры
pDevMode^.dmFields := pDevMode^.dmFields or DM_PAPERSIZE or DM_ORIENTATION;
pDevMode^.dmPaperSize := DMPAPER_A5;
pDevMode^.dmOrientation := DMORIENT_PORTRAIT;
finally
GlobalUnlock(hDevMode);
end;
// Открываем диалог с модифицированными параметрами
PrintDlg.Flags := PD_ALLPAGES or PD_RETURNDC;
PrintDlg.hDevMode := hDevMode;
if PrintDlg(PrintDlg) then
begin
// Печать с выбранными параметрами
end;
if hDevMode <> 0 then
GlobalFree(hDevMode);
end;
end;
Заключение
В этой статье мы рассмотрели несколько способов передачи параметров принтера и бумаги в диалог печати Delphi VCL. Вы можете выбрать подход в зависимости от ваших требований:
Простые настройки через свойства TPrinter
Использование TPrinterSetupDialog для базовой настройки
Работа с DEVMODE для продвинутых настроек
Прямое использование Windows API для максимального контроля
Помните, что перед установкой параметров всегда следует проверять доступность принтеров в системе и обрабатывать возможные ошибки.
Статья описывает методы передачи параметров принтера и бумаги в диалоге печати Delphi VCL, включая использование стандартных компонентов и работу с DEVMODE.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.