Вверх ↑
Ответов: 3655
Рейтинг: 69
#1: 2005-11-06 17:50:09 ЛС | профиль | цитата
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]
карма: 0

0