datasource连query
 dbgrid 连 datasource

解决方案 »

  1.   

    对楼上的可以;
    或是你把dbgrid里的数据导入的临时表里也可以
      

  2.   

    unit MainFrm;
    interfaceuses
      SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
      Forms, Dialogs, Grids, DBGrids, DB, DBTables, Menus, StdCtrls, Spin,
      Gauges, ExtCtrls, ComCtrls;type
      TMainForm = class(TForm)
        tblClients: TTable;
        dsClients: TDataSource;
        dbgColumns: TDBGrid;
        mmMain: TMainMenu;
        mmiFile: TMenuItem;
        mmiPrint: TMenuItem;
        lblLastName: TLabel;
        lblColumns: TLabel;
        lblFirstName: TLabel;
        lblAddress: TLabel;
        lblCity: TLabel;
        lblState: TLabel;
        lblZip: TLabel;
        edtHeaderFont: TEdit;
        lblHeader: TLabel;
        btnHeaderFont: TButton;
        FontDialog: TFontDialog;
        edtLastName: TEdit;
        edtFirstName: TEdit;
        edtAddress: TEdit;
        edtCity: TEdit;
        edtState: TEdit;
        edtZip: TEdit;
        udLastName: TUpDown;
        udFirstName: TUpDown;
        udAddress: TUpDown;
        udCity: TUpDown;
        udState: TUpDown;
        udZip: TUpDown;
        procedure mmiPrintClick(Sender: TObject);
        procedure btnHeaderFontClick(Sender: TObject);
      private
        PixelsInInchx: integer;
        LineHeight: Integer;
       { Keeps track of vertical space in pixels, printed on a page }
        AmountPrinted: integer;
       { Number of pixels in 1/10 of an inch. This is used for line spacing }
        TenthsOfInchPixelsY: integer;
        procedure PrintLine(Items: TStringList);
        procedure PrintHeader;
        procedure PrintColumnNames;
      end;var
      MainForm: TMainForm;implementation
    uses printers, AbortFrm;{$R *.DFM}procedure TMainForm.PrintLine(Items: TStringList);
    var
      OutRect: TRect;
      Inches: double;
      i: integer;
    begin
      // First position the print rect on the print canvas
      OutRect.Left := 0;
      OutRect.Top := AmountPrinted;
      OutRect.Bottom := OutRect.Top + LineHeight;
      With Printer.Canvas do
        for i := 0 to Items.Count - 1 do
        begin
          Inches := longint(Items.Objects[i]) * 0.1;
          // Determine Right edge
          OutRect.Right := OutRect.Left + round(PixelsInInchx*Inches);
          if not Printer.Aborted then
           // Print the line
            TextRect(OutRect, OutRect.Left, OutRect.Top, Items[i]);
          // Adjust right edge
          OutRect.Left := OutRect.Right;
        end;
     { As each line prints, AmountPrinted must increase to reflect how
       much of a page has been printed on based on the line height. }
      AmountPrinted := AmountPrinted + TenthsOfInchPixelsY*2;
    end;procedure TMainForm.PrintHeader;
    var
      SaveFont: TFont;
    begin
     { Save the current printer's font, then set a new print font based
      on the selection for Edit1 }
      SaveFont := TFont.Create;
      try
        Savefont.Assign(Printer.Canvas.Font);
        Printer.Canvas.Font.Assign(edtHeaderFont.Font);
        // First print out the Header
        with Printer do
        begin
          if not Printer.Aborted then
            Canvas.TextOut((PageWidth div 2)-(Canvas.TextWidth(edtHeaderFont.Text)
                             div 2),0, edtHeaderFont.Text);
         // Increment AmountPrinted by the LineHeight
          AmountPrinted := AmountPrinted + LineHeight+TenthsOfInchPixelsY;
        end;
        // Restore the old font to the Printer's Canvas property
        Printer.Canvas.Font.Assign(SaveFont);
      finally
        SaveFont.Free;
      end;
    end;procedure TMainForm.PrintColumnNames;
    var
      ColNames: TStringList;
    begin
      { Create a TStringList to hold the column names and the
        positions where the width of each column is based on values
        in the TEdit controls. }
      ColNames := TStringList.Create;
      try
        // Print the column headers using a bold/underline style
        Printer.Canvas.Font.Style := [fsBold, fsUnderline];    with ColNames do
        begin
          // Store the column headers and widths in the TStringList object
          AddObject('LAST NAME',  pointer(StrToInt(edtLastName.Text)));
          AddObject('FIRST NAME', pointer(StrToInt(edtFirstName.Text)));
          AddObject('ADDRESS',    pointer(StrToInt(edtAddress.Text)));
          AddObject('CITY',       pointer(StrToInt(edtCity.Text)));
          AddObject('STATE',      pointer(StrToInt(edtState.Text)));
          AddObject('ZIP',        pointer(StrToInt(edtZip.Text)));
        end;    PrintLine(ColNames);
        Printer.Canvas.Font.Style := [];  
      finally
        ColNames.Free;   // Free the column name TStringList instance
      end;
    end;procedure TMainForm.mmiPrintClick(Sender: TObject);
    var
      Items: TStringList;
    begin
      { Create a TStringList instance to hold the fields and the widths
        of the columns in which they'll be drawn based on the entries in
        the edit controls }
      Items := TStringList.Create;
      try
        // Determine pixels per inch horizontally
        PixelsInInchx := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
        TenthsOfInchPixelsY := GetDeviceCaps(Printer.Handle,
                                LOGPIXELSY) div 10;
        AmountPrinted := 0;
        MainForm.Enabled := false; // Disable the parent form
        try
          Printer.BeginDoc;
          AbortForm.Show;
          Application.ProcessMessages;
          { Calculate the line height based on text height using the
            currently rendered font }
          LineHeight := Printer.Canvas.TextHeight('X')+TenthsOfInchPixelsY;
          if edtHeaderFont.Text <> '' then
            PrintHeader;
          PrintColumnNames;
          tblClients.First;
          { Store each field value in the TStringList as well as its
            column width }
          while (not tblClients.Eof) or Printer.Aborted do
          begin        Application.ProcessMessages;
            with Items do
            begin
              AddObject(tblClients.FieldByName('LAST_NAME').AsString,
                            pointer(StrToInt(edtLastName.Text)));
              AddObject(tblClients.FieldByName('FIRST_NAME').AsString,
                            pointer(StrToInt(edtFirstName.Text)));
              AddObject(tblClients.FieldByName('ADDRESS_1').AsString,
                            pointer(StrToInt(edtAddress.Text)));
              AddObject(tblClients.FieldByName('CITY').AsString,
                            pointer(StrToInt(edtCity.Text)));
              AddObject(tblClients.FieldByName('STATE').AsString,
                            pointer(StrToInt(edtState.Text)));
              AddObject(tblClients.FieldByName('ZIP').AsString,
                            pointer(StrToInt(edtZip.Text)));
            end;
            PrintLine(Items);
            { Force print job to begin a new page if printed output has
              exceeded page height }
            if AmountPrinted + LineHeight > Printer.PageHeight then
            begin
              AmountPrinted := 0;
              if not Printer.Aborted then
                Printer.NewPage;
              PrintHeader;
              PrintColumnNames;
            end;
            Items.Clear;
            tblClients.Next;
          end;
          AbortForm.Hide;
          if not Printer.Aborted then
            Printer.EndDoc;
        finally
          MainForm.Enabled := true;
        end;
      finally
        Items.Free;
      end;
    end;procedure TMainForm.btnHeaderFontClick(Sender: TObject);
    begin
     { Assign the font selected with FontDialog1 to Edit1. }
      FontDialog.Font.Assign(edtHeaderFont.Font);
      if FontDialog.Execute then
        edtHeaderFont.Font.Assign(FontDialog.Font);
    end;end.
      

  3.   

    得此利器,天下焉有不平不可削.................//==============================================================================
    //打印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;
      

  4.   

    //==============================================================================
    //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;
              //====================================================================
              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;
      

  5.   

    datasource连query
     dbgrid 连 datasource