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

Как изменить размер страницы при печати

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

Как изменить размер страницы при печати

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

Другие настройки, которые можно поменять, смотрите в TDEVMODE в хелпе Delphi 1.02 или DEVMODE в Delphi 2.01.

Следующий пример демонстрирует изменение размера печатаемой страницы:


procedure TForm1.Button1Click(Sender: TObject);
var
  Device: array[0..255] of char;
  Driver: array[0..255] of char;
  Port: array[0..255] of char;
  hDMode: THandle;
  PDMode: PDEVMODE;
begin
  Printer.PrinterIndex := Printer.PrinterIndex;
  Printer.GetPrinter(Device, Driver, Port, hDMode);
  if hDMode <> 0 then begin
    pDMode := GlobalLock(hDMode);
    if pDMode <> nil then begin

     {Set to legal}
      pDMode^.dmFields := pDMode^.dmFields or dm_PaperSize;
      pDMode^.dmPaperSize := DMPAPER_LEGAL;

     {Set to custom size}
      pDMode^.dmFields := pDMode^.dmFields or
        DM_PAPERSIZE or
        DM_PAPERWIDTH or
        DM_PAPERLENGTH;
      pDMode^.dmPaperSize := DMPAPER_USER;
      pDMode^.dmPaperWidth := 100 {SomeValueInTenthsOfAMillimeter};
      pDMode^.dmPaperLength := 100 {SomeValueInTenthsOfAMillimeter};

     {Set the bin to use}
      pDMode^.dmFields := pDMode^.dmFields or DMBIN_MANUAL;
      pDMode^.dmDefaultSource := DMBIN_MANUAL;

      GlobalUnlock(hDMode);
    end;
  end;
  Printer.PrinterIndex := Printer.PrinterIndex;
  Printer.BeginDoc;
  Printer.Canvas.TextOut(100, 100, 'Test 1');
  Printer.EndDoc;
end;

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

Процедура Button1Click вызывается при клике кнопки на форме. Она получает текущие настройки принтера с помощью Printer.GetPrinter(). Затем она изменяет размер бумаги, установив dmFields в включение dmPaperSize и задавая dmPaperSize конкретным значением (в этом случае - DMPAPER_LEGAL или пользовательское определенное значение).

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

После изменения настроек принтера она начинает новый документ с помощью Printer.BeginDoc() и печатает текст на странице с помощью Canvas.TextOut(). Наконец, она заканчивает документ с помощью Printer.EndDoc().

Вот несколько предложений для улучшения кода:

  1. Вместо использования жестких значений размеров бумаги можно использовать константы или перечисления, чтобы сделать код более читаемым и поддерживаемым.
  2. Можно добавить обработку ошибок, чтобы проверить, успешно ли были изменены настройки принтера, или если возникла ошибка при печати.
  3. Если пользователь хочет указать пользовательский размер бумаги, можно добавить поля ввода для ширины и длины и использовать эти значения вместо жестких значений.
  4. Можно также рассмотреть добавление опций для других настроек печати, таких как ориентация (портрет или ландшафт), отступы и размер шрифта.

Вот обновленная версия кода с некоторыми из этих предложений:

procedure TForm1.Button1Click(Sender: TObject);
var
  Device: array[0..255] of char;
  Driver: array[0..255] of char;
  Port: array[0..255] of char;
  hDMode: THandle;
  PDMode: PDEVMODE;
begin
  Printer.PrinterIndex := Printer.PrinterIndex;

  // Get current printer settings
  Printer.GetPrinter(Device, Driver, Port, hDMode);

  if hDMode <> 0 then begin
    pDMode := GlobalLock(hDMode);
    if pDMode <> nil then begin

      // Set paper size to legal
      pDMode^.dmFields := pDMode^.dmFields or dm_PaperSize;
      pDMode^.dmPaperSize := DMPAPER_LEGAL;

      // Allow user input for custom paper size
      PaperWidthEdit.Text := '100';  // Replace with your edit control
      PaperLengthEdit.Text := '100';  // Replace with your edit control

      // Set paper size to custom
      pDMode^.dmFields := pDMode^.dmFields or
        DM_PAPERSIZE or
        DM_PAPERWIDTH or
        DM_PAPERLENGTH;
      pDMode^.dmPaperSize := DMPAPER_USER;
      StrToInt(PaperWidthEdit.Text) * 10;  // Convert to tenths of a millimeter
      StrToInt(PaperLengthEdit.Text) * 10;  // Convert to tenths of a millimeter

      // Set bin to use
      pDMode^.dmFields := pDMode^.dmFields or DMBIN_MANUAL;
      pDMode^.dmDefaultSource := DMBIN_MANUAL;

      GlobalUnlock(hDMode);
    end;
  end;

  Printer.PrinterIndex := Printer.PrinterIndex;
  Printer.BeginDoc();
  Printer.Canvas.TextOut(100, 100, 'Test 1');
  Printer.EndDoc();
end;

Обратите внимание, что я заменил жесткие значения размеров бумаги на edit controls для ввода пользователем. Вам нужно создать эти edit controls в вашей форме и установить свойство Text соответственно.

Один из способов изменить размер страницы при печати - это изменить структуру devicemode у принтера, для чего можно использовать настройки TDEVMODE в хелпе Delphi или DEVMODE в Delphi 2.01.


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

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




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


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


реклама


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

Время компиляции файла: 2024-08-19 13:29:56
2024-10-08 17:48:54/0.006072998046875/1