• 打印TDBGrid内容


    procedure PrintDbGrid(DataSet:TDataSet;DbGrid:TDbGrid;Title:String);
    var
    PointX,PointY:integer;
     ScreenX:integer;
     i,lx,ly:integer;
     px1,py1,px2,py2:integer;
     RowPerPage,RowPrinted:integer;
     ScaleX:Real;
     THeight:integer;
     TitleWidth:integer;
     SumWidth:integer;
     PageCount:integer;
     SpaceX,SpaceY:integer;
     RowCount:integer;
    begin
    PointX:=Round(GetDeviceCaps(printer.Handle,LOGPIXELSX)/2.54);
    PointY:=Round(GetDeviceCaps(printer.Handle,LOGPIXELSY)/2.54);
     ScreenX:=Round(Screen.PixelsPerInch/2.54);
    ScaleX:=PointX/ScreenX;
     RowPrinted:=0;
     SumWidth:=0;
     printer.BeginDoc;
     With Printer.Canvas do
     begin
      DataSet.DisableControls;
       DataSet.First ;
       THeight:=Round(TextHeight('我')*1.5);//设定每行高度为字符高的1.5倍
       SpaceY:= Round(TextHeight('我')/4);
       SpaceX:=Round(TextWidth('我')/4);
       RowPerpage:=Round((printer.PageHeight-5*PointY)/THeight); //上下边缘各2厘米
       ly:=2*PointY;
       PageCount:=0;
      while not DataSet.Eof do
       begin
        if (RowPrinted=RowPerPage) or (RowPrinted=0) then
         begin
          if RowPrinted<>0 then
          Printer.NewPage;
           RowPrinted:=0;
           PageCount:=PageCount+1;
           Font.Name:='宋体';
           Font.size:=16;
           Font.Style:=Font.Style+[fsBold];
           lx:=Round((Printer.PageWidth-TextWidth(Title))/2);
           ly:=2*PointY;
           TextOut(lx,ly,Title);
           Font.Size:=11;
           Font.Style:=Font.Style-[fsBold];
           lx:=Printer.PageWidth-5*PointX;
           ly:=Round(2*PointY+0.2*PointY);
           if RowPerPage*PageCount>DataSet.RecordCount then
            RowCount:=DataSet.RecordCount
           else
           RowCount:=RowPerPage*PageCount;
           TextOut(lx,ly,'第'+IntToStr(RowPerPage*(PageCount-1)+1)+'-'+IntToStr(RowCount)+'条,共'+IntToStr(DataSet.RecordCount)+'条');
           lx:=2*PointX;
           ly:=ly+THeight*2;
           py1:=ly-SpaceY;
           if RowCount=DataSet.RecordCount then
            py2:=py1+THeight*(RowCount-RowPerPage*(PageCount-1)+1)
           else
            py2:=py1+THeight*(RowPerPage+1);
           SumWidth:=lx;
           for i:=0 to DBGrid.Columns.Count-1 do
           begin
           px1:=SumWidth-SpaceX;
             px2:=SumWidth;
             MoveTo(px1,py1);
             LineTo(px2,py2);
             TitleWidth:=TextWidth(DBGrid.Columns[i].Title.Caption);
             lx:=Round(SumWidth+(DBGrid.Columns[i].width*scaleX-titleWidth)/2);
             TextOut(lx,ly,DBGrid.Columns[i].Title.Caption);
             SumWidth:=Round(SumWidth+DBGrid.Columns[i].width*scaleX)+SpaceX*2;
           end;
           px1:=SumWidth;      //画最后一条竖线
           px2:=SumWidth;
           MoveTo(px1,py1);
           LineTo(px2,py2);
           px1:=2*PointX;            //画第一条横线
         px2:=SumWidth;
          py1:=ly-SpaceY;
          py2:=ly-SpaceY;
           MoveTo(px1,py1);
           LineTo(px2,py2);
           py1:=py1+THeight;
           py2:=py2+THeight;
           MoveTo(px1,py1);
           LineTo(px2,py2);
         end;
       lx:=2*PointX;
         ly:=ly+THeight;
         px1:=lx;
         px2:=SumWidth;
         py1:=ly-SpaceY+THeight;
         py2:=ly-SpaceY+THeight;
         MoveTo(px1,py1);
         LineTo(px2,py2);
         for i:=0 to DBGrid.Columns.Count-1 do
         begin
           TextOut(lx,ly,DataSet.FieldByname(DBGrid.Columns[i].Fieldname).AsString);
           lx:=Round(lx+DBGrid.Columns[i].width*ScaleX+SpaceX*2);
         end;
         RowPrinted:=RowPrinted+1;
         DataSet.next;
       end;
       DataSet.first;
       DataSet.EnableControls;
     end;
     printer.EndDoc;
    end;


    打印StringGrid内容

    Procedure TACDListerMain.PrintTable;
     Var
       margins: TRect;
       spacing: Integer;
       Cols: TList;
       Dlg: TPrintProgressDlg;

     Procedure SetColumnWidth;
       Var
         i, k, w: Integer;
       Begin
         Printer.Canvas.Font.Style := [ fsBold ];
         For i := 0 To Pred( Grid.ColCount ) Do

          Cols.Add( Pointer( Printer.Canvas.TextWidth( Grid.Cells[ i,0 ] )));

         Printer.Canvas.Font.Style := [];
         For i := 1 To Pred( Grid.RowCount ) Do
           For k := 0 To Pred( Grid.ColCount ) Do Begin
             w:= Printer.Canvas.TextWidth( Grid.Cells[ k, i ] );
             If w > Integer( Cols[ k ] ) Then
               Cols[ k ] := Pointer( w );
           End; { For }

         w := 2 * Printer.Canvas.Font.PixelsPerInch div 3;
         margins :=
           Rect( w, w, Printer.PageWidth-w, Printer.PageHeight - w );
         spacing := Printer.Canvas.Font.PixelsPerInch div 10;

         w := 0;
         For i := 0 To Pred(cols.Count) Do
           w := w + Integer( cols[ i ] ) + spacing;
         w := w - spacing;
         If w > (margins.right-margins.left ) Then Begin
           w := w - (margins.right-margins.left );
           cols[ cols.Count-2 ] :=
             Pointer( Integer( cols[ cols.Count-2 ] ) - w );
         End; { If }

         w:= 0;
         For i := 0 To Pred(cols.Count) Do
           w := w + Integer( cols[ i ] ) + spacing;
         margins.right := w - spacing + margins.left;
       End; { SetColumnWidth }

     Procedure DoPrint;
       Var
         i: Integer;
         y: Integer;
       Procedure DoLine(lineno: Integer);
         Var
           x, n: Integer;
           r: TRect;
           th: Integer;
         Begin
           If Length(Grid.Cells[0,lineno]) = 0 Then Exit;

           x:= margins.left;
           With Printer.Canvas Do Begin
             th := TextHeight( '膟' );
             For n := 0 To Pred( Cols.Count ) Do Begin
               r := Rect( 0, 0, Integer(Cols[ n ]), th);
               OffsetRect( r, x, y );
               TextRect( r, x, y, Grid.Cells[ n, lineno ] );
               x := r.right + spacing;
             End; { For }
           End; { With }
           y := y + th;
         End; { DoLine }
       Procedure DoHeader;
         Begin
           y:= margins.top;
           With Printer.Canvas Do Begin
             Font.Style := [ fsBold ];
             DoLine( 0 );
             Pen.Width := Font.PixelsPerInch div 72;
             Pen.Color := clBlack;
             MoveTo( margins.left, y );
             LineTo( margins.right, y );
             Inc( y, 2 * Pen.Width );
             Font.Style := [ ];
           End; { With }
         End; { DoHeader }
       Begin
         y:= 0;
         For i := 1 To Pred( Grid.RowCount ) Do Begin
           Dlg.Progress( i );
           Application.ProcessMessages;
           If FPrintAborted Then Exit;

           If y = 0 Then
             DoHeader;
           DoLine( i );
           If y >= margins.bottom Then Begin
             Printer.NewPage;
             y:= 0;
           End; { If }
         End; { For }
       End; { DoPrint }

     Begin
       FPrintAborted := False;
       Dlg := TPrintProgressDlg.Create( Application );
       With Dlg Do
       try
         OnAbort := PrintAborted;
         Display( cPrintPreparation );
         SetProgressRange( 0, Grid.RowCount );
         Show;
         Application.ProcessMessages;
         Printer.Orientation := poLandscape;

         Printer.BeginDoc;
         Cols:= Nil;
         try
           Cols:= TLIst.Create;
           Printer.Canvas.Font.Assign( Grid.Font );
           SetColumnWidth;
           Display( cPrintProceeding );
           Application.ProcessMessages;
           DoPrint;
         finally
           Cols.Free;
           If FPrintAborted Then
             Printer.Abort
           Else
             Printer.EndDoc;
         end;
       finally
         Close;
       End; { With }
     End; { TACDListerMain.PrintTable }

  • 相关阅读:
    20145313张雪纯 《Java程序设计》第7周学习总结
    20145313第二次实验
    20145313Java第一次实验
    20145313张雪纯 《Java程序设计》第6周学习总结
    RocEDU.阅读.写作《霍乱时期的爱情》书摘(三)
    20145313张雪纯 《Java程序设计》第5周学习总结
    RocEDU.阅读.写作《霍乱时期的爱情》书摘(二)
    20145313张雪纯 《Java程序设计》第4周学习总结
    RocEDU.阅读.写作《霍乱时期的爱情》书摘(一)
    20145310 GDB调试汇编堆栈分析
  • 原文地址:https://www.cnblogs.com/beeone/p/1792370.html
Copyright © 2020-2023  润新知