想打印一条
直接用赋值
比如你的数据集是用adoquery1
则直接用adoquery1.fieldbyname('字段名').asstring;
如果是整个DBGrid的内容
则在报表里title和detail这两个band
然后就直接连上对应的数据集和字段名就ok 了

解决方案 »

  1.   

    //==============================================================================
    //打印DBGrid中的所有数据********************************************************
    //==============================================================================
    procedure DBGridPrint(DBGrid: TDBGrid; Title: string);
    var PrintDialog: TPrintDialog;
        RowHeight, Temp_X, Temp_Y, PageEdgeX, PageEdgeY, PixelsPerInchX, PixelsPerInchY: integer;
        TempStr: string;
        Scale: Double;
        Rect: TRect;
    //==============================================================================
    //1.输出标题********************************************************************
    //==============================================================================
        procedure Print_Title;
        begin
          Rect := Bounds(0,0,Printer.PageWidth,PageEdgeY);
          Printer.Canvas.Font.Name := '楷体_GB2312';
          Printer.Canvas.Font.Style := Printer.Canvas.Font.Style + [fsBold];
          Printer.Canvas.Font.Size := 20;
          DrawText(Printer.Canvas.Handle,PChar(Title),Length(Title),Rect,DT_CENTER or DT_VCENTER or DT_SINGLELINE);
          Printer.Canvas.Rectangle(PageEdgeX, PageEdgeY, Printer.PageWidth - PageEdgeX, PageEdgeY + 1);
        end;
    //==============================================================================
    //2.输出列头********************************************************************
    //==============================================================================
        procedure Print_Column;
        var j: integer;
        begin
          Printer.Canvas.Font.Name := '黑体';
          Printer.Canvas.Font.Size := 9;
          Temp_X := PageEdgeX;
          Temp_Y := PageEdgeY;
          //========================================================================
          for j:=1 to DBGrid.Columns.Count do
          begin
            if not DBGrid.Columns[j-1].Visible then Continue;
            //======================================================================
            TempStr := DBGrid.Columns[j-1].Title.Caption;
            Rect := Bounds(Temp_X, Temp_Y, Trunc(DBGrid.Columns[j-1].Width*Scale), RowHeight);
            case DBGrid.Columns[j-1].Field.Alignment of
              //====================================================================
              //case.1.居中*********************************************************
              //====================================================================
              taCenter: DrawText(Printer.Canvas.Handle,PChar(TempStr),Length(TempStr),Rect,DT_CENTER or DT_VCENTER or DT_SINGLELINE);
              //====================================================================
              //case.2.居左*********************************************************
              //====================================================================
              taLeftJustify: DrawText(Printer.Canvas.Handle,PChar(TempStr),Length(TempStr),Rect,DT_LEFT or DT_VCENTER or DT_SINGLELINE);
              //====================================================================
              //case.3.居右*********************************************************
              //====================================================================
              taRightJustify: if Rect.Right-Rect.Left>=Printer.Canvas.TextWidth(TempStr)
                              then DrawText(Printer.Canvas.Handle,PChar(TempStr),Length(TempStr),Rect,DT_RIGHT or DT_VCENTER or DT_SINGLELINE)
                              else DrawText(Printer.Canvas.Handle,PChar(TempStr),Length(TempStr),Rect,DT_LEFT or DT_VCENTER or DT_SINGLELINE);
            end;
            Temp_X := Temp_X + Trunc(DBGrid.Columns[j-1].Width*Scale);
          end;
          Temp_Y := Temp_Y + RowHeight;
        end;
    //==============================================================================
    //3.输出DBGrid内容**************************************************************
    //==============================================================================
        procedure Print_Cells;
        var j: integer;
        begin
          Printer.Canvas.Font.Name := '宋体';
          Printer.Canvas.Font.Style := Printer.Canvas.Font.Style - [fsBold];
          while Temp_Y<Printer.PageHeight-PageEdgeY do
          begin
            Temp_X := PageEdgeX;
            for j:=1 to DBGrid.Columns.Count do
            begin
              if not DBGrid.Columns[j-1].Visible then Continue;
              //====================================================================
              Rect := Bounds(Temp_X, Temp_Y, Trunc(DBGrid.Columns[j-1].Width*Scale), RowHeight);
              if (DBGrid.Columns[j-1].Field is TCurrencyField)
              or (DBGrid.Columns[j-1].Field is TLargeIntField)
              or (DBGrid.Columns[j-1].Field is TSmallIntField)
              or (DBGrid.Columns[j-1].Field is TIntegerField)
              or (DBGrid.Columns[j-1].Field is TFloatField)
              or (DBGrid.Columns[j-1].Field is TWordField)
              then TempStr := FormatFloat(',##0.00',DBGrid.Columns[j-1].Field.AsFloat)
              else TempStr := DBGrid.Columns[j-1].Field.AsString;
      

  2.   

    //====================================================================
              case DBGrid.Columns[j-1].Field.Alignment of
                //==================================================================
                //case.1.居中*******************************************************
                //==================================================================
                taCenter: DrawText(Printer.Canvas.Handle,PChar(TempStr),Length(TempStr),Rect,DT_CENTER or DT_VCENTER or DT_SINGLELINE);
                //==================================================================
                //case.2.居左*******************************************************
                //==================================================================
                taLeftJustify: DrawText(Printer.Canvas.Handle,PChar(TempStr),Length(TempStr),Rect,DT_LEFT or DT_VCENTER or DT_SINGLELINE);
                //==================================================================
                //case.3.居右*******************************************************
                //==================================================================
                taRightJustify: DrawText(Printer.Canvas.Handle,PChar(TempStr),Length(TempStr),Rect,DT_RIGHT or DT_VCENTER or DT_SINGLELINE);
              end;
              Temp_X := Temp_X + Trunc(DBGrid.Columns[j-1].Width*Scale);
            end;
            Temp_Y := Temp_Y + RowHeight;
            DBGrid.DataSource.DataSet.Next;
            if DBGrid.DataSource.DataSet.Eof then Exit;
          end;
        end;
    //==============================================================================
    //4.输出页脚********************************************************************
    //==============================================================================
        procedure Print_Footer;
        begin
          Temp_Y := Printer.PageHeight - PageEdgeY + RowHeight;
          //========================================================================
          //4.0.输出横线************************************************************
          //========================================================================
          Printer.Canvas.Rectangle(PageEdgeX, Temp_Y, Printer.PageWidth - PageEdgeX, Temp_Y + 1);
          //========================================================================
          //4.1.输出日期************************************************************
          //========================================================================
          Rect := Bounds(PageEdgeX, Temp_Y, Printer.PageWidth-PageEdgeX, RowHeight);
          DrawText(Printer.Canvas.Handle,PChar(DateTimeToStr(Now)),Length(DateTimeToStr(Now)),Rect,DT_LEFT or DT_VCENTER or DT_SINGLELINE);
          //========================================================================
          //4.2.输出页号************************************************************
          //========================================================================
          Rect := Bounds(PageEdgeX, Temp_Y, Printer.PageWidth-PageEdgeX*2, RowHeight);
          DrawText(Printer.Canvas.Handle,PChar('#'+IntToStr(Printer.PageNumber)),Length('#'+IntToStr(Printer.PageNumber)),Rect,DT_RIGHT or DT_VCENTER or DT_SINGLELINE);
        end;
    //==============================================================================
    begin
      PrintDialog := TPrintDialog.Create(DBGrid);
      if PrintDialog.Execute then
      begin
        //==========================================================================
        //0.取当前打印机X,Y方向每英寸像素*******************************************
        //==========================================================================
        PixelsPerInchX := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
        PixelsPerInchY := GetDeviceCaps(Printer.Handle, LOGPIXELSY);
        //==========================================================================
        //1.变量初始化**************************************************************
        //==========================================================================
        PageEdgeX := PixelsPerInchX div 6;
        PageEdgeY := PixelsPerInchY div 5 * 4;
        RowHeight := Trunc(1.5 * 9 * PixelsPerInchY / 72);
        Scale :=  PixelsPerInchX / Screen.PixelsPerInch;
        //==========================================================================
        try
          Printer.BeginDoc;
          DBGrid.DataSource.DataSet.First;
          while not DBGrid.DataSource.DataSet.Eof do
          begin
            Print_Title;
            Print_Column;
            Print_Cells;
            Print_Footer;
            Printer.NewPage;
          end;
          //========================================================================
          if not Printer.Aborted then Printer.EndDoc;
        except
          on E:EPrinter do
          begin
            MessageBox(Application.Handle,PChar('打印机没有准备好!'),'提示!',MB_OK+MB_ICONINFORMATION);
            Printer.Abort;
            Exit;
          end;
          on E:Exception do
          begin
            raise;
            Exit;
          end;
        end;
      end;
      //============================================================================
      PrintDialog.Free;
    end;