Amper, Вот код на Делфи для вывода на принтер таблицы .Рисует таблицу выводит данные постранично ,на каждом листе заголовок таблицы ,нумерация листов.Немогу перевести на ХиАсм может возьмешься или кто ещё ?
[code:1]// щелчок на кнопке Печать
procedure TForm1.N2Click(Sender: TObject);
const
LEFT_MARGIN = 0.5; // отступ слева [см]
TOP_MARGIN = 0.5; // отступ сверху [см]
var
dpiX, dpiY : integer; // разрешение принтера по X и Y
kx,ky: real; // коэф. пересчета координат экрана
// в координаты принтера по Х и Y
// таблица
p: array[0..9] of integer; // позиции колонок
x1,y1,x2,y2: integer; // границы таблицы
px,py: integer; // указатель точки вывода
i,j,n,m,nl,w: integer;
Label tt;
begin
m:=35; //конец цикла
n:=0; //начало цикла
nl:=1; //номер страницы
{ Разрешение экрана и принтера разное,
поэтому чтобы добиться соответствия
размеров изображения на экране и принтере,
координаты точек экрана надо преобразовать
в координаты принтера, умножить на коэф.,
значение которого зависит от разрешения принтера.
Например, если разрешение принтера 300 dpi,
то значение коэффициента равно 3.125, т.к.
разрешение экрана - 96 dpi.
}
// ф-я GetDeviceCaps позволяет получить характеристики
// устройства. LOGPIXELSX - кол-во пикселей на дюйм по X
tt://вызов Goto
dpiX := GetDeviceCaps(Printer.handle,LOGPIXELSX);
dpiY := GetDeviceCaps(Printer.handle,LOGPIXELSY);
kx := dpiX / Screen.PixelsPerInch;
ky := dpiY / Screen.PixelsPerInch;
ky := 3;//уменьшить высоту таблицы
px := Round(LEFT_MARGIN / 2.54 * dpiX);
py := Round(TOP_MARGIN / 2.54 * dpiY);
// вычислим "принтерные" координаты колонок таблицы
p[0] := px;
for i:=1 to 9 do
begin
p[i] := p[i-1] + Round(jzStringGrid1.ColWidths[i-1]* kx);
end;
with Printer do
begin
//poPortrait вертикальная
//poLandscape горизонтальная
//горизонтальная ориентация листа
{Printer}
if nl = 1 then begin
Orientation := poLandscape;
BeginDoc; // открыть печать
end;
// заголовок таблицы
Canvas.Font.Name := Label1.Font.Name;
Canvas.Font.Size := Label1.Font.Size;
Canvas.TextOut(px,py,Label1.Caption);
Form1.Label2.Caption :='Стр № '+IntToStr(nl);
Canvas.TextOut(px+3600,py,Label2.Caption);
// таблица - содержимое StringGrid1
py := py+ Round(Label1.Font.Size * 2 * ky);
x1 := px; y1 := py; // левый верхний угол таблицы
Canvas.Font.Name := jzStringGrid1.Font.Name;// тип шрифта
Canvas.Font.Size := jzStringGrid1.Font.Size;// размер шрифта
x2 := p[9] + Round(jzStringGrid1.ColWidths[9]* kx);
if nl = 1 then begin
if KOL < m then
m := KOL;{jzStringGrid1.RowCount}
y2 := py + Round((m+2) * jzStringGrid1.RowHeights[1] * ky);
end;
if nl > 1 then begin
y2 := py + Round((m-n+4) * jzStringGrid1.RowHeights[1] * ky);
Canvas.MoveTo(p[0]-10,py);
Canvas.LineTo(x2,py);
for w := 0 to 9 do begin
Canvas.TextOut(P[w],py+10,jzStringGrid1.Cells[w,0]);
end;
py:=py+ Round(jzStringGrid1.RowHeights[0]* ky);
Canvas.MoveTo(p[0]-10,py);
Canvas.LineTo(x2,py);
for w := 0 to 9 do begin
Canvas.TextOut(P[w],py+10,jzStringGrid1.Cells[w,1]);
end;
py:=py+ Round(jzStringGrid1.RowHeights[0]* ky);
end;
for j:=n to m+1 do
begin
// строки таблицы
for i:=0 to jzStringGrid1.ColCount do
begin
Canvas.TextOut(P[i],py,jzStringGrid1.Cells[i,j]);
// гор. линия
Canvas.MoveTo(p[0]-10,py);
Canvas.LineTo(x2,py);
end;
py:=py+ Round(jzStringGrid1.RowHeights[j]* ky);
end;
Canvas.MoveTo(p[0]-10,py);
Canvas.LineTo(x2,py);
// вертикальные линии
for i:=0 to jzStringGrid1.ColCount do
begin
Canvas.MoveTo(p[i]-10,y1);
Canvas.LineTo(p[i]-10,y2);
end;
Canvas.MoveTo(x2,y1);
Canvas.LineTo(x2,y2);
if m < KOL then begin
nl := nl+1;
n := j;
m := m+35;
if m > KOL then m := KOL;
NewPage;
Goto tt;
end;
EndDoc; // закрыть печать
Orientation := poPortrait;// вертикальная ориентация листа
RzTabControl1.TabIndex := -1;
end;
end;[/code:1]
Ответов: 3655
Рейтинг: 69
|
|||
карма: 0 |
|