当然要用报表控件了。不然太累了。
如果用QuickReport,你估计有什么问题吗?结果复杂的话,可以用OnNeedData事件操作。

解决方案 »

  1.   

    用报表是可以输出一条记录,可是QUERY1是查到好几十条记录呀。查询结果是实时查询所]
    得,有好几十条呢,我要一次性输出到某种介质上,打印出来,并不是一条条打印。
    天呀,救命。!!!
      

  2.   

    你的方法应该这样类似实现,只要把dbgrid的内容实时打印出来就行了。选有用的参考一下吧:
    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;
        AmountPrinted: integer;
        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
      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;
          OutRect.Right := OutRect.Left + round(PixelsInInchx*Inches);
          if not Printer.Aborted then
            TextRect(OutRect, OutRect.Left, OutRect.Top, Items[i]);
          OutRect.Left := OutRect.Right;
        end;
      AmountPrinted := AmountPrinted + TenthsOfInchPixelsY*2;
    end;procedure TMainForm.PrintHeader;
    var
      SaveFont: TFont;
    begin
      SaveFont := TFont.Create;
      try
        Savefont.Assign(Printer.Canvas.Font);
        Printer.Canvas.Font.Assign(edtHeaderFont.Font);
        with Printer do
        begin
          if not Printer.Aborted then
            Canvas.TextOut((PageWidth div 2)-(Canvas.TextWidth(edtHeaderFont.Text)
                             div 2),0, edtHeaderFont.Text);
          AmountPrinted := AmountPrinted + LineHeight+TenthsOfInchPixelsY;
        end;
        Printer.Canvas.Font.Assign(SaveFont);
      finally
        SaveFont.Free;
      end;
    end;procedure TMainForm.PrintColumnNames;
    var
      ColNames: TStringList;
    begin
      ColNames := TStringList.Create;
      try
        Printer.Canvas.Font.Style := [fsBold, fsUnderline];    with ColNames do
        begin
          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;
      end;
    end;procedure TMainForm.mmiPrintClick(Sender: TObject);
    var
      Items: TStringList;
    begin
      Items := TStringList.Create;
      try
        PixelsInInchx := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
        TenthsOfInchPixelsY := GetDeviceCaps(Printer.Handle,
                                LOGPIXELSY) div 10;
        AmountPrinted := 0;
        MainForm.Enabled := false;
        try
          Printer.BeginDoc;
          AbortForm.Show;
          Application.ProcessMessages;
          LineHeight := Printer.Canvas.TextHeight('X')+TenthsOfInchPixelsY;
          if edtHeaderFont.Text <> '' then
            PrintHeader;
          PrintColumnNames;
          tblClients.First;
          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);
            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
      FontDialog.Font.Assign(edtHeaderFont.Font);
      if FontDialog.Execute then
        edtHeaderFont.Font.Assign(FontDialog.Font);
    end;end.
      

  3.   

    >>“用报表是可以输出一条记录”、“并不是一条条打印”不会吧,你的报表只能一张表显示一条记录?你把用Query1得到的结果集一次性交给报表控件打出来不行吗?真是奇怪了!具体说说你的查询是怎么回事?