Рекомендуемый вид формы про граммы приведен на рис. 1.77.

Рис. 1.77. Форма программы Счет

{ Программа демонстрирует только вывод на печать. )
unit schet_;
interface
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls, Grids, ExtCtrls;
type
TForml = class(TForm)
StringGridl: TStringGrid;
Buttonl: TButton;
Button2: TButton;
Editl: TEdit;
Edit2: TEdit;
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
/ Public declarations }
end;
var
Forral: TForml;
implementation
{$R *.dfm}
uses Printers;
procedure TForml.FormCreate(Sender: TObject);
var
i: integer;
begin
with StringGridl do
begin
Cells[0,0] := ' №';
Cells[1,0] := ' Наименование';
Cells[2,0] := ' Цена1;
Cells[3,0] := ' Кол-во';
Cells[4,0] := ' Сумма';
for i:=l to 10 do
Cells[0,i] := ' '+IntToStr(i);
end;
end;
// щелчок на кнопке Печать
procedure TForml.Button2Click(Sender: TObject);
const
LEFT_MARGIN =2; // отступ слева 2 см
TOP_MARGIN = 2; // отступ сверху 2 см
var
dpix, dpiY : integer; // разрешение принтера по X и У
кх,ку: real; // коэф. пересчета координат экрана
// в координаты принтера по X и У
// таблица
р: array[0..4] of integer; // позиции колонок
xl,yl,x2,y2: integer; // границы таблицы
рх,ру: integer; // указатель точки вывода
i,j: integer;
«
begin
( Разрешение экрана и принтера разное,
поэтому, чтобы добиться соответствия
размеров изображения на экране и принтере,
координаты точек экрана надо преобразовать
в координаты принтера, домножить на коэф.,
значение которого зависит от разрешения принтера.
Например, если разрешение принтера 300 dpi,
то значение коэффициента равно 3.125, т. к.
разрешение экрана — 96 dpi.
)
// функция GetDeviceCaps позволяет получить характеристики
// устройства. LOGPIXELSX — кол-во пикселов на дюйм по X
dpiX := GetDeviceCaps(Printer.handle,LOGPIXELSX);
dpiY := GetDeviceCaps(Printer.handle,LOGPIXELSY);
kx := dpiX / Screen.PixelsPerlnch;
ky := dpiY / Screen.PixelsPerlnch;
px := Round(LEFT_MARGIN / 2.54 * dpiX);
py := Round(TOP_MARGIN / 2.54 * dpiY);
// вычислим "принтерные" координаты колонок таблицы
р[0] := рх;
for i: =1 to 4 do
begin
p[i) := p[i-l] + Round(StringGridl.ColWidths[i-l]* kx) ;
end;
with Printer do
begin
BeginDoc; // открыть печать
// заголовок таблицы
Canvas.Font.Name := Editl.Font.Name;
Canvas.Font.Size := Editl.Font.Size;
Canvas.TextOut(px,py,Editl.Text) ;
// таблица — содержимое StringGridl
РУ := РУ+ Round(Editl.Font.Size * 2 * ky) ;
xl := px; yl := py; // левый верхний угол таблицы
Canvas.Font.Name := StringGridl.Font.Name;
Canvas.Font.Size := StringGridl.Font.Size;
x2 := p[4] + Round(StringGridl.ColWidths[4]* kx);
y2 := py +
Round(StringGridl.RowCount *
StringGridl.RowHeights[1] * ky);
for j:=0 to StringGridl.RowCount do
begin
// строки таблицы
for i:=0 to StringGridl.ColCount do
begin
Canvas.TextOut(P[i],py,StringGridl.Cells[i,j]);
// горизонтальная линия
Canvas.MoveTo(p[0],py);
Canvas.LineTo(x2,py);
end;
py:=py+ Round(StringGridl.RowHeights[j]* ky);
end;
// вертикальные линии
for i:=0 to StringGridl.ColCount -1 do
begin
Canvas.MoveTo(p[i], yl) ;
Canvas.LineTo(p[i],y2);
end;
Canvas.MoveTo(x2,у1);
Canvas.LineTo(x2,y2);
EndDoc; // закрыть печать
end;
end;
end.