*****23****分,垂手可得 当然要用报表控件了。不然太累了。如果用QuickReport,你估计有什么问题吗?结果复杂的话,可以用OnNeedData事件操作。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用报表是可以输出一条记录,可是QUERY1是查到好几十条记录呀。查询结果是实时查询所]得,有好几十条呢,我要一次性输出到某种介质上,打印出来,并不是一条条打印。天呀,救命。!!! 你的方法应该这样类似实现,只要把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;implementationuses 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. >>“用报表是可以输出一条记录”、“并不是一条条打印”不会吧,你的报表只能一张表显示一条记录?你把用Query1得到的结果集一次性交给报表控件打出来不行吗?真是奇怪了!具体说说你的查询是怎么回事? 跪求一个SQL子查询并相减的语句。 关于tstringlist.delete 程序中加入'更新動態IP地址'的功能? 请问大家FastReport 怎么在程序运行后打开设计窗口,就象是双击frReport1一样 关于字符串问题 关于自制组件二() 有几个可能与DELPHI关系不大的问题。 新手请教,如何汉化DBNavigator删除时提示的"Delete record ?" 求助:哪里有 delphi7 的补丁下啊 我差不多每天要重装一次系统 怎么在delphi中上传文件 ◎◎◎◎◎◎ 寻 Delphi 6 个人版的序列号 ◎◎◎◎◎◎ 一个简单问题,请指教
得,有好几十条呢,我要一次性输出到某种介质上,打印出来,并不是一条条打印。
天呀,救命。!!!
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.