Все просто. Если знать как. Приведу небольшой код, позволяющий стать гуру в области печати. Надеюсь. Смотрите на комментарии. Все очень просто.
const
INCHES_PER_MILIMETER: Real = 0.04;
type
TOffset = record
X, Y: Integer;
end;
var
FDeviceName: string; {Имя устройства}
FPageHeightPixel, FPageWidthPixel: Integer; {Высота и ширина страницы}
FOrientation: TPrinterOrientation; {Ориентация}
FPrintOffsetPixels: TOffset;
FPixelsPerMMX, FPixelsPerMMY: Real;
MMSize, FPageHeightMM: Integer;
TheReport, TheHead, HeadLine, RecordLine, TFname, TLname: string;
procedure TMissing_Rep.GetDeviceSettings;
var
retval: integer;
PixX, PixY: Integer;
begin
FDeviceName := Printer.Printers[Printer.PrinterIndex]; {Получаем имя}
FPageHeightPixel := Printer.PageHeight; {Получаем высоту страницы}
FPageWidthPixel := Printer.PageWidth; {Получаем ширину страницы}
FOrientation := Printer.Orientation;
{Ориентация}{Получаем отступ при печати (поля страницы)}{$IFDEF WIN32}
FPrintOffsetPixels.X := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETX);
FPrintOffsetPixels.Y := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETY);
{$ELSE}
retval := Escape(Printer.Handle, GETPRINTINGOFFSET,
0, nil, @FPrintOffsetPixels);
{$ENDIF}{Получаем количество пикселей, печатаемое на миллиметре бумаги}
PixX := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
PixY := GetDeviceCaps(Printer.Handle, LOGPIXELSY);
FPixelsPerMMX := INCHES_PER_MILIMETER * PixX;
FPixelsPerMMY := INCHES_PER_MILIMETER * PixY;
FPageHeightMM := Round(FPageHeightPixel / FPixelsPerMMY);
end;
function TMissing_Rep.PutText(mmX, mmY: Integer; S: string; LeftAlign:
Boolean): boolean;
var
X, Y: Integer;
align: WORD;
beginif LeftAlign then
align := SetTextAlign(Printer.Handle, TA_BOTTOM or TA_LEFT)
else
align := SetTextAlign(Printer.Handle, TA_BOTTOM or TA_RIGHT);
result := FALSE; {Вначале присваиваем флаг неудачи при выполнении функции}
X := Trunc(mmX * FPixelsPerMMX) - FPrintOffsetPixels.X;
Y := Trunc(mmY * FPixelsPerMMY) - FPrintOffsetPixels.Y;
if X < 0 then
exit;
if Y < 0 then
exit;
Printer.Canvas.TextOut(X, Y, S);
result := TRUE;
end;
procedure TMissing_Rep.Print_ButClick(Sender: TObject);
var
PixelSize: Integer;
begin
Print_But.Enabled := False;
if PrintDialog1.Execute thenbegin
Printer.Canvas.Font := Missing_Rep.Font;
PixelSize := Printer.Canvas.TextHeight('Yy');
MMSize := Round(PixelSize / FPixelsPerMMY);
Printer.Title := 'Отчет';
Printer.BeginDoc; { начинаем пересылать задание на печать }
PrintGenerator;
Printer.EndDoc; { EndDoc заканчивает задание печати }end;
Print_But.Enabled := True;
end;
procedure TMissing_Rep.PrintGenerator;
var
yLoc, NumRows, TheRow: Integer;
procedure Heading;
begin
yLoc := 20;
PutText(20, 20, TheHead, TRUE);
yLoc := yLoc + MMSize;
PutText(20, yLoc, StringGrid1.Cells[0, 0], TRUE);
PutText(60, yLoc, StringGrid1.Cells[1, 0], TRUE);
PutText(100, yLoc, StringGrid1.Cells[2, 0], TRUE);
PutText(120, yLoc, StringGrid1.Cells[3, 0], TRUE);
PutText(150, yLoc, StringGrid1.Cells[4, 0], TRUE);
yLoc := yLoc + MMSize;
end;
procedure Footer;
begin
PutText(100, FPageHeightMM, InttoStr(Printer.PageNumber), TRUE);
end;
begin
Heading;
TheRow := 1;
while (TheRow < StringGrid1.RowCount) dobeginif (yLoc > (FPageHeightMM - MMSize)) thenbegin
Footer;
Printer.NewPage;
Heading;
end;
TheGauge.Progress := Round(100 * TheRow / (StringGrid1.RowCount - 1));
PutText(20, yLoc, StringGrid1.Cells[0, TheRow], TRUE);
PutText(60, yLoc, StringGrid1.Cells[1, TheRow], TRUE);
PutText(100, yLoc, StringGrid1.Cells[2, TheRow], TRUE);
PutText(120, yLoc, StringGrid1.Cells[3, TheRow], TRUE);
PutText(150, yLoc, StringGrid1.Cells[4, TheRow], TRUE);
yLoc := yLoc + MMSize;
TheRow := TheRow + 1;
end;
Footer;
end;
Программный код на языке Delphi, который предназначен для печати данных из таблицы (grid control) в простом виде. Он может быть частью более крупной программы, например, генератора отчетов или инструментария для печати данных из grid control.
Основные процедуры:
GetDeviceSettings: Procedure, которая получает различные настройки, связанные с устройством принтера, такие как высота страницы, ширина страницы, ориентация и смещение пикселей.
PutText: Функция, которая печатает текст в указанном месте (в миллиметрах) на канвасе принтера. Она учитывает шрифт принтера и плотность пикселей.
Print_ButClick: Procedure, которая вызывается при клике кнопки для инициализации печати. Она отображает диалог печати, настраивает шрифт и заголовок принтера, начинает документ, печатает отчет с помощью процедуры PrintGenerator, а затем заканчивает документ.
Процедура PrintGenerator отвечает за генерацию печатного вывода. Она состоит из двух частей:
Секция заголовка: Часть, которая печатает текст заголовка и некоторые ячейки таблицы в фиксированном месте.
Цикл печати данных: Цикл, который перебирает строки в grid control, печатая данные каждой строки в том же месте, что и предыдущая строка.
Некоторые заметные моменты:
Код использует объект TPrinter Delphi для взаимодействия с устройством принтера.
Он использует различные функции Windows API (например, GetDeviceCaps, SetTextAlign) и функции печати Delphi (например, Printer.Canvas.TextOut).
Функция PutText использует фиксированный размер шрифта для всех текстов, что может не быть подходящим для всех ситуаций.
Код предполагает, что grid control имеет фиксированное количество столбцов и строк.
В целом, этот код предоставляет основу для печати данных из grid control в Delphi. Однако он может потребовать дополнительных модификаций для удовлетворения конкретных требований или форматирования.
В статье описаны хитрости печати в программировании, в частности, код на Delphi, который позволяет создавать отчеты с использованием текстовых и графических элементов.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.