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]
|