这是我编的一个打印DBGIRD的实例,供参考。
procedure Tf_ypmh.Button12Click(Sender: TObject);
const
leftblank=1;
rightblank=1;
topblank=1;
bottomblank=1;
const_page=11;
var
pointx,pointy:integer;
pointscale,printstep:integer;
s:string;
x,y:integer;
page,i:integer;
m_sum_grje,m_sum_grje_all:real;//发货合计
m_sum_lsje,m_sum_lsje_all:real;//零售合计
m_sum_ce,m_sum_ce_all:real;//差额合计
m_s_sum:string;//字符临时量
m_page:integer;//页码
m_str:string;
m_newpage:boolean;
m_mess:integer;
printok:string;
begin
printok:='y';
while printok='y' do
begin
pointx:=trunc(getdevicecaps(printer.handle,logpixelsx)/2.54);
pointy:=trunc(getdevicecaps(printer.handle,logpixelsy)/2.54);
pointscale:=trunc(getdevicecaps(printer.handle,logpixelsx)/screen.pixelsperinch+0.5);
printer.orientation:=poportrait;
printer.canvas.font.name:='宋体';
printer.canvas.font.size:=10;
s:='胡';
printstep:=printer.canvas.textheight(s)+16;//行距
x:=pointx*leftblank-70;
y:=pointy*topblank+20; //
m_sum_grje:=0;
m_sum_lsje:=0;
m_sum_ce:=0;
m_sum_grje_all:=0;
m_sum_lsje_all:=0;
m_sum_ce_all:=0;
m_page:=1;
m_newpage:=true; //创建新页标记
with f_dbfrom.t_qd_rkd do begin
edit10.enabled:=true;
edit7.enabled:=false;
edit11.enabled:=false;
//spinedit3.enabled:=false;
spinedit2.enabled:=false;
edit8.enabled:=false;
edit9.enabled:=false;
//f_rep_qd_fhd.quickrep1.preview;
//打印报表
if Active and (recordcount>0) then
begin
page:=0;
printer.begindoc;
first;
while not eof do
begin
if (page=const_page) then //换页
begin
m_sum_grje:=0;
m_sum_lsje:=0;
m_sum_ce:=0;
m_page:=m_page+1;
page:=0;
x:=pointx*leftblank-70;
if m_newpage=false then
y:=y+printstep*6+16;
end;
if page=0 then
begin
m_newpage:=false;
printer.Canvas.Font.Size:=16;
printer.Canvas.textout(x+600,y-80,'药品入库清单及验收单');
printer.Canvas.Font.Size:=10;
printer.Canvas.TextOut(x+10,y-30,'验收单位:正场卫生院');
printer.Canvas.TextOut(x+400,y-30,'供货单位:'+edit10.text);
printer.Canvas.TextOut(x+700,y-30,'到货日期:'+datetostr(date()));
printer.Canvas.TextOut( x+1000,y-30,'入库单编号:'+fieldbyname('rkdbh').asstring);
printer.Canvas.TextOut(x+1300,y-30,'第 '+ inttostr(m_page)+' 页');
end ;
procedure Tf_ypmh.Button12Click(Sender: TObject);
const
leftblank=1;
rightblank=1;
topblank=1;
bottomblank=1;
const_page=11;
var
pointx,pointy:integer;
pointscale,printstep:integer;
s:string;
x,y:integer;
page,i:integer;
m_sum_grje,m_sum_grje_all:real;//发货合计
m_sum_lsje,m_sum_lsje_all:real;//零售合计
m_sum_ce,m_sum_ce_all:real;//差额合计
m_s_sum:string;//字符临时量
m_page:integer;//页码
m_str:string;
m_newpage:boolean;
m_mess:integer;
printok:string;
begin
printok:='y';
while printok='y' do
begin
pointx:=trunc(getdevicecaps(printer.handle,logpixelsx)/2.54);
pointy:=trunc(getdevicecaps(printer.handle,logpixelsy)/2.54);
pointscale:=trunc(getdevicecaps(printer.handle,logpixelsx)/screen.pixelsperinch+0.5);
printer.orientation:=poportrait;
printer.canvas.font.name:='宋体';
printer.canvas.font.size:=10;
s:='胡';
printstep:=printer.canvas.textheight(s)+16;//行距
x:=pointx*leftblank-70;
y:=pointy*topblank+20; //
m_sum_grje:=0;
m_sum_lsje:=0;
m_sum_ce:=0;
m_sum_grje_all:=0;
m_sum_lsje_all:=0;
m_sum_ce_all:=0;
m_page:=1;
m_newpage:=true; //创建新页标记
with f_dbfrom.t_qd_rkd do begin
edit10.enabled:=true;
edit7.enabled:=false;
edit11.enabled:=false;
//spinedit3.enabled:=false;
spinedit2.enabled:=false;
edit8.enabled:=false;
edit9.enabled:=false;
//f_rep_qd_fhd.quickrep1.preview;
//打印报表
if Active and (recordcount>0) then
begin
page:=0;
printer.begindoc;
first;
while not eof do
begin
if (page=const_page) then //换页
begin
m_sum_grje:=0;
m_sum_lsje:=0;
m_sum_ce:=0;
m_page:=m_page+1;
page:=0;
x:=pointx*leftblank-70;
if m_newpage=false then
y:=y+printstep*6+16;
end;
if page=0 then
begin
m_newpage:=false;
printer.Canvas.Font.Size:=16;
printer.Canvas.textout(x+600,y-80,'药品入库清单及验收单');
printer.Canvas.Font.Size:=10;
printer.Canvas.TextOut(x+10,y-30,'验收单位:正场卫生院');
printer.Canvas.TextOut(x+400,y-30,'供货单位:'+edit10.text);
printer.Canvas.TextOut(x+700,y-30,'到货日期:'+datetostr(date()));
printer.Canvas.TextOut( x+1000,y-30,'入库单编号:'+fieldbyname('rkdbh').asstring);
printer.Canvas.TextOut(x+1300,y-30,'第 '+ inttostr(m_page)+' 页');
end ;
解决方案 »
- 求助
- 2个人员姓名显示的sql语句的问题
- 论坛灌水机,谁又源代码让小弟学习一下,在此感谢
- 200分不手软!! 如何让 TCppWebBrowser 控件在显示网页后平面化,去掉它的边框!
- 一个有关sql server 2000 sp_prepare系统存储过程的问题
- Delphi5中怎么设置,改变MDI背景呢?
- 用什么函数可以做到向指定窗口发送按键,还有把指定的窗口关闭。
- 将记录插入数据库表中时,如何用程序检查、实现记录的唯一
- 数据转换器Xp完整版发布了,这回安装之后可以正常运行了,还加入了功能强大的自定义报表,真是大棒了!
- 求救,如何使用TDBChart
- 在哪里能下载到SQL Server 2000 Personal Edition???
- 问一个简单的问题. sql 语句的用法
if page=0 then //表头
for i:=0 to 13 do
begin
printer.canvas.rectangle(x,y,x+dbgrid1.Columns.Items[i].Width*pointscale,Y+printstep);
printer.canvas.textout(x+8,y+8,dbgrid1.Columns[i].title.caption);
x:=x+dbgrid1.Columns.Items [i].Width*pointscale;
end
else
for i:=0 to 13 do
begin
printer.canvas.rectangle(x,y,x+dbgrid1.Columns.Items[i].Width*pointscale,Y+printstep);
if (i=4) or (i=5) or (i=6) or (i=7) or (i=8) then
begin
str(dbgrid1.Fields[i].asfloat:0:2,m_str);
printer.canvas.textout(x+8,y+8,m_str);
end;
if (i=0)or (i=1)or (i=2) or (i=3)or(i=9)or (i=10) or (i=11)or(i=13) then
printer.canvas.textout(x+8,y+8,dbgrid1.Fields[i].asstring);
x:=x+dbgrid1.Columns.Items [i].Width*pointscale;
end;
if page<>0 then
begin
//统计
m_sum_grje:=m_sum_grje+fieldbyname('sumgrj').asfloat;
m_sum_lsje:=m_sum_lsje+fieldbyname('sumdj').asfloat;
m_sum_ce:=m_sum_ce+fieldbyname('sumyjce').asfloat;
m_sum_grje_all:=m_sum_grje_all+fieldbyname('sumgrj').asfloat;
m_sum_lsje_all:=m_sum_lsje_all+fieldbyname('sumdj').asfloat;
m_sum_ce_all:=m_sum_ce_all+fieldbyname('sumyjce').asfloat;
next;
end;
y:=y+printstep;
if (page=const_page-1)or eof then //打印合计
begin
printer.Canvas.Rectangle(pointx*leftblank-70,y,x,y+printstep);
str(m_sum_grje:0:2,m_s_sum);
printer.Canvas.TextOut(100+8,y+8,'购货金额小计:'+m_s_sum);
str(m_sum_lsje:0:2,m_s_sum);
printer.Canvas.TextOut(504+8,y+8,'零售金额小计:'+m_s_sum);
str(m_sum_ce:0:2,m_s_sum);
printer.Canvas.TextOut(1000+8,y+8,'差额小计:'+m_s_sum);
y:=y+printstep;
printer.Canvas.TextOut(pointx*leftblank-70+8,y+8,'会计(签字): 验收人(签字): 药品类型:'+m_yplx );
y:=y-printstep;
//打印表尾
end;
{ if eof then
begin
y:=y+printstep;
printer.Canvas.Rectangle(pointx*leftblank-70,y,x,y+printstep);
str(m_sum_grje_all:0:3,m_s_sum);
printer.Canvas.TextOut(100+8,y+8,'发货金额总计:'+m_s_sum);
str(m_sum_lsje_all:0:3,m_s_sum);
printer.Canvas.TextOut(504+8,y+8,'零售金额总计:'+m_s_sum);
str(m_sum_ce_all:0:3,m_s_sum);
printer.Canvas.TextOut(1000+8,y+8,'差额总计:'+m_s_sum);
y:=y+printstep;
printer.Canvas.TextOut(pointx*leftblank-70+8,y+8,'会计(签字): 验收人(签字): 药品类型:'+m_yplx );
y:=y-printstep;
//打印表尾
end; } page:=page+1;
x:=pointx*leftblank-70;
if m_page<6 then
if (y+printstep)>(printer.pageheight-120) then //
begin
m_newpage:=true;
printer.newpage;
y:=pointy*topblank+80; //80
end;
if (m_page>=6)and (m_page<9) then
if (y+printstep-60)>(printer.pageheight-120) then
begin
m_newpage:=true;
printer.newpage;
y:=pointy*topblank+140; //80
end;
if (m_page>=9)and (m_page<12) then
if (y+printstep-120)>(printer.pageheight-120) then
begin
m_newpage:=true;
printer.newpage;
y:=pointy*topblank+200; //80
end;
if (m_page>=12)and (m_page<15) then
if (y+printstep-180)>(printer.pageheight-120) then
begin
m_newpage:=true;
printer.newpage;
y:=pointy*topblank+260; //80
end;
if m_page>=15 then
if (y+printstep-240)>(printer.pageheight-120) then
begin
m_newpage:=true;
printer.newpage;
y:=pointy*topblank+320; //80
end; //
end;
printer.enddoc;
first;
//application.messagebox('打印完成','打印',32);
end;
//打印报表
//f_rep_qd_rkd.quickrep1.Preview;;
m_mess:=application.messagebox('你要重新打印吗?','友情提示',mb_yesno+mb_defbutton2+mb_systemmodal+
mb_iconexclamation);
if m_mess=6 then
PRINTOK:='y'
ELSE
PRINTOK:='N'; end;
end;
with f_dbfrom.q_sql do
begin
close;
sql.Clear;
sql.Add('insert into yp_rkd(rkdbh,ypbh,ypdj,ypgg,ypcd,ypdw,ypsl,yppfj,ypgrj,ypph,ypyxrq,fphm,rktime)');
sql.Add('select a.rkdbh,a.ypbh,b.ypdj,b.ypgg,b.ypcd,b.ypdw,a.ypsl,b.yppfj,b.ypgrj,a.ypph,a.ypyxrq,a.fphm,a.rkrq');
sql.Add('from qd_rkd a,yp b where a.ypbh=b.ypbh');
execsql;
end;
with f_dbfrom.t_qd_rkd do
begin
first;
while not isempty() do
begin
edit;
delete;
next;
end;
end;
button10.Enabled:=false;
button11.Enabled:=false;
button12.enabled:=false;
end;
if page=0 then //表头
for i:=0 to 13 do
begin
printer.canvas.rectangle(x,y,x+dbgrid1.Columns.Items[i].Width*pointscale,Y+printstep);
printer.canvas.textout(x+8,y+8,dbgrid1.Columns[i].title.caption);
x:=x+dbgrid1.Columns.Items [i].Width*pointscale;
end
else
for i:=0 to 13 do
begin
printer.canvas.rectangle(x,y,x+dbgrid1.Columns.Items[i].Width*pointscale,Y+printstep);
if (i=4) or (i=5) or (i=6) or (i=7) or (i=8) then
begin
str(dbgrid1.Fields[i].asfloat:0:2,m_str);
printer.canvas.textout(x+8,y+8,m_str);
end;
if (i=0)or (i=1)or (i=2) or (i=3)or(i=9)or (i=10) or (i=11)or(i=13) then
printer.canvas.textout(x+8,y+8,dbgrid1.Fields[i].asstring);
x:=x+dbgrid1.Columns.Items [i].Width*pointscale;
end;
if page<>0 then
begin
//统计
m_sum_grje:=m_sum_grje+fieldbyname('sumgrj').asfloat;
m_sum_lsje:=m_sum_lsje+fieldbyname('sumdj').asfloat;
m_sum_ce:=m_sum_ce+fieldbyname('sumyjce').asfloat;
m_sum_grje_all:=m_sum_grje_all+fieldbyname('sumgrj').asfloat;
m_sum_lsje_all:=m_sum_lsje_all+fieldbyname('sumdj').asfloat;
m_sum_ce_all:=m_sum_ce_all+fieldbyname('sumyjce').asfloat;
next;
end;
y:=y+printstep;
if (page=const_page-1)or eof then //打印合计
begin
printer.Canvas.Rectangle(pointx*leftblank-70,y,x,y+printstep);
str(m_sum_grje:0:2,m_s_sum);
printer.Canvas.TextOut(100+8,y+8,'购货金额小计:'+m_s_sum);
str(m_sum_lsje:0:2,m_s_sum);
printer.Canvas.TextOut(504+8,y+8,'零售金额小计:'+m_s_sum);
str(m_sum_ce:0:2,m_s_sum);
printer.Canvas.TextOut(1000+8,y+8,'差额小计:'+m_s_sum);
y:=y+printstep;
printer.Canvas.TextOut(pointx*leftblank-70+8,y+8,'会计(签字): 验收人(签字): 药品类型:'+m_yplx );
y:=y-printstep;
//打印表尾
end;
{ if eof then
begin
y:=y+printstep;
printer.Canvas.Rectangle(pointx*leftblank-70,y,x,y+printstep);
str(m_sum_grje_all:0:3,m_s_sum);
printer.Canvas.TextOut(100+8,y+8,'发货金额总计:'+m_s_sum);
str(m_sum_lsje_all:0:3,m_s_sum);
printer.Canvas.TextOut(504+8,y+8,'零售金额总计:'+m_s_sum);
str(m_sum_ce_all:0:3,m_s_sum);
printer.Canvas.TextOut(1000+8,y+8,'差额总计:'+m_s_sum);
y:=y+printstep;
printer.Canvas.TextOut(pointx*leftblank-70+8,y+8,'会计(签字): 验收人(签字): 药品类型:'+m_yplx );
y:=y-printstep;
//打印表尾
end; } page:=page+1;
x:=pointx*leftblank-70;
if m_page<6 then
if (y+printstep)>(printer.pageheight-120) then //
begin
m_newpage:=true;
printer.newpage;
y:=pointy*topblank+80; //80
end;
if (m_page>=6)and (m_page<9) then
if (y+printstep-60)>(printer.pageheight-120) then
begin
m_newpage:=true;
printer.newpage;
y:=pointy*topblank+140; //80
end;
if (m_page>=9)and (m_page<12) then
if (y+printstep-120)>(printer.pageheight-120) then
begin
m_newpage:=true;
printer.newpage;
y:=pointy*topblank+200; //80
end;
if (m_page>=12)and (m_page<15) then
if (y+printstep-180)>(printer.pageheight-120) then
begin
m_newpage:=true;
printer.newpage;
y:=pointy*topblank+260; //80
end;
if m_page>=15 then
if (y+printstep-240)>(printer.pageheight-120) then
begin
m_newpage:=true;
printer.newpage;
y:=pointy*topblank+320; //80
end; //
end;
printer.enddoc;
first;
//application.messagebox('打印完成','打印',32);
end;
//打印报表
//f_rep_qd_rkd.quickrep1.Preview;;
m_mess:=application.messagebox('你要重新打印吗?','友情提示',mb_yesno+mb_defbutton2+mb_systemmodal+
mb_iconexclamation);
if m_mess=6 then
PRINTOK:='y'
ELSE
PRINTOK:='N'; end;
end;
with f_dbfrom.q_sql do
begin
close;
sql.Clear;
sql.Add('insert into yp_rkd(rkdbh,ypbh,ypdj,ypgg,ypcd,ypdw,ypsl,yppfj,ypgrj,ypph,ypyxrq,fphm,rktime)');
sql.Add('select a.rkdbh,a.ypbh,b.ypdj,b.ypgg,b.ypcd,b.ypdw,a.ypsl,b.yppfj,b.ypgrj,a.ypph,a.ypyxrq,a.fphm,a.rkrq');
sql.Add('from qd_rkd a,yp b where a.ypbh=b.ypbh');
execsql;
end;
with f_dbfrom.t_qd_rkd do
begin
first;
while not isempty() do
begin
edit;
delete;
next;
end;
end;
button10.Enabled:=false;
button11.Enabled:=false;
button12.enabled:=false;
end;