Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

При отображении диалога печати в Delphi VCL, как передать параметры принтера и бумаги, чтобы они отображались в диалоге.

Delphi , ОС и Железо , Принтеры и Печать

Передача параметров принтера и бумаги в диалоге печати 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. Вы можете выбрать подход в зависимости от ваших требований:

  1. Простые настройки через свойства TPrinter
  2. Использование TPrinterSetupDialog для базовой настройки
  3. Работа с DEVMODE для продвинутых настроек
  4. Прямое использование Windows API для максимального контроля

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

Создано по материалам из источника по ссылке.

Статья описывает методы передачи параметров принтера и бумаги в диалоге печати Delphi VCL, включая использование стандартных компонентов и работу с DEVMODE.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


:: Главная :: Принтеры и Печать ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-27 16:48:41/0.003676176071167/0