Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Задание на Дельфи.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.27 Mб
Скачать

68. Напишите программу, используя которую можно подгото вить и распечатать накладную. Рекомендуемый вид формы про граммы приведен на рис. 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.