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

Определить минимальные поля для принтера

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

Определить минимальные поля для принтера


uses 
  Printers; 

type 
  TMargins = record 
    Left, 
    Top, 
    Right, 
    Bottom: Double 
end; 

procedure GetPrinterMargins(var Margins: TMargins); 
var 
  PixelsPerInch: TPoint; 
  PhysPageSize: TPoint; 
  OffsetStart: TPoint; 
  PageRes: TPoint; 
begin 
  PixelsPerInch.y := GetDeviceCaps(Printer.Handle, LOGPIXELSY); 
  PixelsPerInch.x := GetDeviceCaps(Printer.Handle, LOGPIXELSX); 
  Escape(Printer.Handle, GETPHYSPAGESIZE, 0, nil, @PhysPageSize); 
  Escape(Printer.Handle, GETPRINTINGOFFSET, 0, nil, @OffsetStart); 
  PageRes.y := GetDeviceCaps(Printer.Handle, VERTRES); 
  PageRes.x := GetDeviceCaps(Printer.Handle, HORZRES); 
  // Top Margin 
  Margins.Top := OffsetStart.y / PixelsPerInch.y; 
  // Left Margin 
  Margins.Left := OffsetStart.x / PixelsPerInch.x; 
  // Bottom Margin 
  Margins.Bottom := ((PhysPageSize.y - PageRes.y) / PixelsPerInch.y) - 
    (OffsetStart.y / PixelsPerInch.y); 
  // Right Margin 
  Margins.Right := ((PhysPageSize.x - PageRes.x) / PixelsPerInch.x) - 
    (OffsetStart.x / PixelsPerInch.x); 
end; 

function InchToCm(Pixel: Single): Single; 
// Convert inch to Centimeter 
begin 
  Result := Pixel * 2.54 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
  Margins: TMargins; 
begin 
 GetPrinterMargins(Margins); 
 ShowMessage(Format('Margins: (Left: %1.3f, Top: %1.3f, Right: %1.3f, Bottom: %1.3f)', 
  [InchToCm(Margins.Left), 
   InchToCm(Margins.Top), 
   InchToCm(Margins.Right), 
   InchToCm(Margins.Bottom)])); 
end;

Перевод контента на русский язык:

Код, который вы предоставили, написан на Delphi и используется для расчета минимальных отступов для принтера. Процедура GetPrinterMargins рассчитывает физические значения отступов принтера с помощью вызовов функций Windows API.

Вот некоторые предложения:

  1. Переменная PixelsPerInch могла быть объявлена как массив (TPoint) вместо отдельных переменных.
  2. Расчеты Margin.Left, Margin.Top, Margin.Right и Margin.Bottom можно упростить и сделать более читаемыми.
  3. Вместо жесткого кодирования коэффициента преобразования дюймов в сантиметры в функции InchToCm, вы могли бы определить константу для этого значения, что делает код более поддерживаемым.
  4. Обработчик события Button1Click тесно связан с компонентом GUI (Form1). Вам может быть полезно переместить логику расчета в отдельную процедуру или функцию, чтобы сделать ее более повторимой и декуплированной от GUI.

Вот обновленная версия вашего кода:

uses 
  Printers;

type 
  TMargins = record 
    Left, 
    Top, 
    Right, 
    Bottom: Double
  end;

const 
  InchesToCentimeters = 2.54;

function InchToCm(Pixel: Single): Single;
begin 
  Result := Pixel * InchesToCentimeters
end;

procedure GetPrinterMargins(var Margins: TMargins);
var 
  PixelsPerInch, PhysPageSize, OffsetStart, PageRes: TPoint;
begin 
  PixelsPerInch.x := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
  PixelsPerInch.y := GetDeviceCaps(Printer.Handle, LOGPIXELSY);

  Escape(Printer.Handle, GETPHYSPAGESIZE, 0, nil, @PhysPageSize);
  Escape(Printer.Handle, GETPRINTINGOFFSET, 0, nil, @OffsetStart);
  PageRes.x := GetDeviceCaps(Printer.Handle, HORZRES);
  PageRes.y := GetDeviceCaps(Printer.Handle, VERTRES);

  Margins.Left := OffsetStart.x / PixelsPerInch.x;
  Margins.Top := OffsetStart.y / PixelsPerInch.y;

  Margins.Right := (PhysPageSize.x - PageRes.x) / PixelsPerInch.x - (OffsetStart.x / PixelsPerInch.x);
  Margins.Bottom := ((PhysPageSize.y - PageRes.y) / PixelsPerInch.y) - (OffsetStart.y / PixelsPerInch.y)
end;

procedure TForm1.Button1Click(Sender: TObject);
var 
  Margins: TMargins;
begin 
  GetPrinterMargins(Margins);

  ShowMessage(Format('Отступы: (Left: %1.3f см, Top: %1.3f см, Right: %1.3f см, Bottom: %1.3f см)', 
     [InchToCm(Margins.Left), InchToCm(Margins.Top), InchToCm(Margins.Right), InchToCm(Margins.Bottom)]));
end;

Надеюсь, это поможет! Пожалуйста, дайте знать, если у вас есть какие-либо дальнейшие вопросы.

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


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

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




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


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


реклама


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

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 12:02:45/0.0058119297027588/1