Один из способов, это перед началом печати изменить структуру 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 thenbegin
pDMode := GlobalLock(hDMode);
if pDMode <> nilthenbegin{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().
Вот несколько предложений для улучшения кода:
Вместо использования жестких значений размеров бумаги можно использовать константы или перечисления, чтобы сделать код более читаемым и поддерживаемым.
Можно добавить обработку ошибок, чтобы проверить, успешно ли были изменены настройки принтера, или если возникла ошибка при печати.
Если пользователь хочет указать пользовательский размер бумаги, можно добавить поля ввода для ширины и длины и использовать эти значения вместо жестких значений.
Можно также рассмотреть добавление опций для других настроек печати, таких как ориентация (портрет или ландшафт), отступы и размер шрифта.
Вот обновленная версия кода с некоторыми из этих предложений:
procedureTForm1.Button1Click(Sender:TObject);varDevice:array[0..255]ofchar;Driver:array[0..255]ofchar;Port:array[0..255]ofchar;hDMode:THandle;PDMode:PDEVMODE;beginPrinter.PrinterIndex:=Printer.PrinterIndex;// Get current printer settingsPrinter.GetPrinter(Device,Driver,Port,hDMode);ifhDMode<>0thenbeginpDMode:=GlobalLock(hDMode);ifpDMode<>nilthenbegin// Set paper size to legalpDMode^.dmFields:=pDMode^.dmFieldsordm_PaperSize;pDMode^.dmPaperSize:=DMPAPER_LEGAL;// Allow user input for custom paper sizePaperWidthEdit.Text:='100';// Replace with your edit controlPaperLengthEdit.Text:='100';// Replace with your edit control// Set paper size to custompDMode^.dmFields:=pDMode^.dmFieldsorDM_PAPERSIZEorDM_PAPERWIDTHorDM_PAPERLENGTH;pDMode^.dmPaperSize:=DMPAPER_USER;StrToInt(PaperWidthEdit.Text)*10;// Convert to tenths of a millimeterStrToInt(PaperLengthEdit.Text)*10;// Convert to tenths of a millimeter// Set bin to usepDMode^.dmFields:=pDMode^.dmFieldsorDMBIN_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
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.