请问高手:我想实现如下打印功能该如何设计?(不使用数据库,手动输入后按格式打印)(50分)

  • 主题发起人 主题发起人 dh0497
  • 开始时间 开始时间
D

dh0497

Unregistered / Unconfirmed
GUEST, unregistred user!
[?]
我不从数据库中读取数据,数据直接输入,输入数据后然后要求打印出指定格式的表单。可以选择多份打印。关键是不使用数据库,那我的报表数据该如何读入啊??
 
可以用QuickReport,在OnNeedData中对QRLabel赋值
 
还能说的具体点吗?~~
 
呵呵,我看至少有两种解决方法:
1.用Excel,当然也可以用word
2.用AC Report,优点是还可以集成在程序里:)
 
如果真的要求这么简单,我推荐用Excel,因为这样不用写代码。
 
AC Report??是什么东东
我现在就是想用delphi实现这个功能啊
 
把窗体设计成报表形式不就行了,用的时候再把指定的区送打印机
 
同意boy2002cn:
PrintForm控件可以帮你完成窗体的打印.
这个控件在printatonce控件里.
我正用它,
 
FR可以实现,你也可以自己写个打印程序。
 
请问各位高手,用FR怎样实现啊??[?][:)]
 
procedure Tf_comm.BitBtn1Click(Sender: TObject);
//取得字符的高度
function change(s:string):string;
var
len,pa:integer;
begin
len:=length(s);
pa:=pos('.',s);
if (pa<>0)then
case len-pa of
1:change:=s+'0';
2:change:=s;
else
begin
messagedlg('数据输入有错,可能是小数点后的位数!',mtwarning,[mbok],0);
s:='0';
change:=s;
end;
end
else
change:=s+'.00'
end;

function charheight:word;
var
metrics:ttextmetric;
begin
gettextmetrics(printer.handle,metrics);
result:=metrics.tmHeight;
end;

//取得字符的平均宽度
function avgcharwidth:word;
var
metrics:ttextmetric;
begin
gettextmetrics(printer.canvas.handle,metrics);
result:=metrics.tmAveCharWidth;
end;

//取得纸张的物理尺寸--单位:点
function getphicalpaper:Tpoint;
var
pagesize:tpoint;
begin
//pagesize.x:纸张物理宽度-单位:点
//pagesize.y:纸张物理高度-单位:点
escape(printer.handle,GETPHYSPAGESIZE,0,nil,@pagesize);
result:=pagesize;
end;

//取得纸张的逻辑宽度-可打印区域
//取得纸张的逻辑尺寸
function paperlogicsize:tpoint;
var
apoint:tpoint;
begin
apoint.x:=printer.PageWidth;
apoint.y:=printer.PageHeight;
result:=apoint;
end;

//纸张水平对垂直方向的纵横比例
function hvlogincratio:extended;
var
ap:tpoint;
begin
ap:=paperlogicsize;
result:=ap.y/ap.x;
end;

//取得纸张的横向偏移量-单位:点
function getoffsetx:integer;
begin
result:=getdevicecaps(printer.handle,physicaloffsetx);
end;

//取得纸张的纵向偏移量-单位:点
function getoffsety:integer;
begin
result:=getdevicecaps(printer.handle,physicaloffsety);
end;

//毫米单位转换为英寸单位
function mmtoinch(length:extended):extended;
begin
result:=length/25.4;
end;

//英寸单位转换为毫米单位
function inchtomm(length:extended):extended;
begin
result:=length*25.4;
end;

//取得水平方向每英寸打印机的点数
function hpointsperinch:integer;
begin
result:=getdevicecaps(printer.handle,LOGPIXELSX);
end;

//取得纵向方向每英寸打印机的光栅数
function vpointsperinch:integer;
begin
result:=getdevicecaps(printer.handle,LOGPIXELSY);
end;

//横向点单位转换为毫米单位
function xpointtomm(pos:integer):extended;
begin
result:=pos*25.4/hpointsperinch;
end;

//纵向点单位转换为毫米单位
function ypointtomm(pos:integer):extended;
begin
result:=pos*25.4/vpointsperinch;
end;

procedure setpaperheight(value:integer);
var
device:array[0..255]of char;
driver:array[0..255]of char;
port:array[0..255]of char;
hdmode:thandle;
pdmode:pdevmode;
begin
//自定义纸张最小高度127mm
if value<127 then
value:=127;
//自定义纸张最大高度432mm
if value>432 then
value:=432;
printer.PrinterIndex:=printer.PrinterIndex;
printer.GetPrinter(device,driver,port,hdmode);
if hdmode<>0 then
begin
pdmode:=globallock(hdmode);
if pdmode<>nil then
begin
pdmode^.dmFields:=pdmode^.dmFields or dm_papersize or
dm_paperlength;
pdmode^.dmPaperSize:=dmpaper_user;
pdmode^.dmPaperLength:=value*10;
pdmode^.dmFields:=pdmode^.dmFields or dmbin_manual;
pdmode^.dmDefaultSource:=dmbin_manual;
globalunlock(hdmode);
end;
end;
printer.PrinterIndex:=printer.PrinterIndex;
end;

//设置纸张宽度-单位:mm
procedure setpaperwidth(value:integer);
var
device:array[0..255]of char;
driver:array[0..255]of char;
port:array[0..255]of char;
hdmode:thandle;
pdmode:pdevmode;
begin
//自定义纸张最小宽度70mm
if value<70 then
value:=70;
//自定义纸张最大宽度216mm
if value>216 then
value:=216;
printer.PrinterIndex:=printer.PrinterIndex;
printer.GetPrinter(device,driver,port,hdmode);
if hdmode<>0 then
begin
pdmode:=globallock(hdmode);
if pdmode<>nil then
begin
pdmode^.dmFields:=pdmode^.dmFields or dm_papersize or
dm_paperlength;
pdmode^.dmPaperSize:=dmpaper_user;
//将毫米单位转换为0.1mm单位
pdmode^.dmPaperLength:=value*10;
pdmode^.dmFields:=pdmode^.dmFields or dmbin_manual;
pdmode^.dmDefaultSource:=dmbin_manual;
globalunlock(hdmode);
end;
end;
printer.PrinterIndex:=printer.PrinterIndex;
end;

//在(xmm,ymm)处按指定配置文件信息和字体输出字符串
procedure printtext(x,y:extended;txt:string;configfilename:string;fontsize:integer=12);
var
orx,ory:extended;
px,py:integer;
ap:tpoint;
fn:tstrings;
filename:string;
offsetx,offsety:integer;
begin
//打开配置文件,横向和纵向偏移量
try
fn:=tstringlist.Create;
filename:=extractfilepath(application.exename)+configfilename;
if fileexists(filename) then
begin
fn.LoadFromFile(filename);
//横向偏移量
offsetx:=strtoint(fn.values['x']);
//纵向偏移量
offsety:=strtoint(fn.values['y']);
end
else
begin
//如果没有配置文件,则生成
fn.Values['x']:='0';
fn.Values['y']:='0';
fn.SaveToFile(filename);
end;
finally
fn.Free;
end;
x:=x+offsetx;
y:=y+offsety;
px:=round(round(x*hpointsperinch*10000/25.4)/10000);
py:=round(round(y*vpointsperinch*10000/25.4)/10000);
py:=py+getoffsety;//因为是绝对坐标,因此,不用换算成相对于Y轴坐标
px:=px+2*avgcharwidth;
printer.canvas.Font.Name:='楷体_GB2312';
printer.Canvas.Font.Size:=fontsize-2;
//printer.canvas.font.color:=clgreen;
printer.Canvas.TextOut(px,py,txt);
end;
var
x,y:integer;
begin
//下面程序将货单写入数据库
with table1do
try
open;
if locate('id',edit7.text,[lopartialkey]) then
//记录如果存在则只能修改
begin
edit;
end
else
//记录如果不存在则只能插入
insert;
fieldbyname('id').asstring:=edit7.Text;
fieldbyname('car_id').asstring:=combobox2.text;
fieldbyname('w_coun').asfloat:=strtofloat(edit1.Text);
fieldbyname('w_car').asfloat:=strtofloat(edit2.text);
fieldbyname('W_c_c').asfloat:=strtofloat(edit3.text);
fieldbyname('date_').asdatetime:=strtodate(e_date.Text);
fieldbyname('time_').asdatetime:=strtotime(e_time.text);
fieldbyname('date_2').asdatetime:=strtodate(e_date2.Text);
fieldbyname('time_2').asdatetime:=strtotime(e_time2.text);
{try
if (e_date2.Text<>'')and(e_time2.Text<>'') then
begin
fieldbyname('date_2').asdatetime:=strtodate(e_date2.Text);
fieldbyname('time_2').asdatetime:=strtotime(e_time2.text);
end
except
e_date2.SetFocus;
showmessage('您所输入的日期数据有误,请校正后再重新操作!');
exit
end;
}
fieldbyname('goodname').asstring:=combobox3.Text;
fieldbyname('menory').asfloat:=strtofloat(edit5.text);
fieldbyname('worker').asstring:=combobox1.text;
post;
except
showmessage('保存数据时出错,请检查以后再按‘确定’键!');
combobox2.SetFocus;
exit
end;
//下面程序询问是否打印单据
if messagedlg('是否打印单据?',mtconfirmation,[mbyes,mbno],0)=mryes then
begin
x:=20;
y:=61;
{不知怎么搞的,下面的页面设置总是反过来,设置页长是控制的反而是页宽
没有办法,只能把它反过来用了,}
//setpaperheight(strtoint(f_comm.h));//纸宽
//setpaperwidth(strtoint(f_comm.w));//纸长
printer.begin
Doc;
//第一联
printtext(x,y,edit7.text,'config.txt',strtoint(f_comm.f));//序号
printtext(x,y+9,e_date.Text,'config.txt',strtoint(f_comm.f));//日期
printtext(x,y+17,e_time.text,'config.txt',strtoint(f_comm.f));//第一次过称时间
printtext(x,y+25,e_time2.Text,'config.txt',strtoint(f_comm.f));//第二次过称时间
printtext(x,y+33,combobox2.Text,'config.txt',strtoint(f_comm.f));//车号
printtext(x,y+42,combobox3.Text,'config.txt',strtoint(f_comm.f));//商品名称
printtext(x,y+51,edit5.text,'config.txt',strtoint(f_comm.f));//磅费
printtext(x,y+59,edit1.text,'config.txt',strtoint(f_comm.f));//毛重
printtext(x,y+67,edit2.text,'config.txt',strtoint(f_comm.f));//皮重
printtext(x,y+75,edit3.text,'config.txt',strtoint(f_comm.f));//净重
//第二联
printtext(4*x+10,y,edit7.text,'config.txt',strtoint(f_comm.f));//序号
printtext(4*x+10,y+9,e_date.Text,'config.txt',strtoint(f_comm.f));//日期
printtext(4*x+10,y+17,e_time.text,'config.txt',strtoint(f_comm.f));//第一次过称时间
printtext(4*x+10,y+25,e_time2.Text,'config.txt',strtoint(f_comm.f));//第二次过称时间
printtext(4*x+10,y+33,combobox2.Text,'config.txt',strtoint(f_comm.f));//车号
printtext(4*x+10,y+42,combobox3.Text,'config.txt',strtoint(f_comm.f));//商品名称
printtext(4*x+10,y+51,edit5.text,'config.txt',strtoint(f_comm.f));//磅费
printtext(4*x+10,y+59,edit1.text,'config.txt',strtoint(f_comm.f));//毛重
printtext(4*x+10,y+67,edit2.text,'config.txt',strtoint(f_comm.f));//皮重
printtext(4*x+10,y+75,edit3.text,'config.txt',strtoint(f_comm.f));//净重
//第三联
printtext(x*8+5,y,edit7.text,'config.txt',strtoint(f_comm.f));//序号
printtext(x*8+5,y+9,e_date.Text,'config.txt',strtoint(f_comm.f));//日期
printtext(x*8+5,y+17,e_time.text,'config.txt',strtoint(f_comm.f));//第一次过称时间
printtext(x*8+5,y+25,e_time2.Text,'config.txt',strtoint(f_comm.f));//第二次过称时间
printtext(x*8+5,y+33,combobox2.Text,'config.txt',strtoint(f_comm.f));//车号
printtext(x*8+5,y+42,combobox3.Text,'config.txt',strtoint(f_comm.f));//商品名称
printtext(x*8+5,y+51,edit5.text,'config.txt',strtoint(f_comm.f));//磅费
printtext(x*8+5,y+59,edit1.text,'config.txt',strtoint(f_comm.f));//毛重
printtext(x*8+5,y+67,edit2.text,'config.txt',strtoint(f_comm.f));//皮重
printtext(x*8+5,y+75,edit3.text,'config.txt',strtoint(f_comm.f));//净重
printer.EndDoc;
end;
 
如果用FR,不如用AC Report,输入和作表方便很多:
下载: http://www.acreport.com/
http://syy_tfsky.efile.com.cn
 
多人接受答案了。
 
后退
顶部