“贴”出数据库的数据——用Delphi7.0实现标签打印
数据库技术
前言:在数据库应用中,有时候会涉及标签打印的任务。将这样的任务交给数据库前台开发的好手Delphi来完成应该不是件难事。早期的Delphi版本中,就有一个组件页Quick Report,这个组件页拥有二十多个报表组件,用于将数据库中的数据以报表、图像、图表等方式输出到打印机,用它们来完成这样的任务是件轻而易举的事。
但到了Delphi7.0版本,组件页Quick Report被取消了。实现标签打印功能只有另辟蹊径,笔者经过摸索,找到了一种操作简单实用性强的方法,可以根据实际需要制作标签并输出到打印机。请赶快跟着操作一遍吧。
一、准备标签数据
在进行标签打印前我们先要着手准备标签。先来看看我们如何获得希望打印的标签的数据。
1.连接数据库取得数据
打开Delphi7.0,在你的应用程序窗体上放置ADOConnection1、ADODataSet1、DataSource1、DBGrid1等几个控件。然后我们需要对它们进行一下设置,以便连接数据库获取数据。
设置ADOConnection1
选择ADOConnection1,在其“ConnectionString”属性中,选择“Use Connection String”的Build按钮,在提供者标签中选择“Microsoft OLE DB Provider for SQL Server”,在连接标签的“选择或输入服务器名称”下拉列表框中输入你的数据库服务器名称,输入用户名和密码,把“允许保存密码”复选框打上对钩,在“服务器上选择数据库”中选择一个数据库名称“Test”,测试成功后退出。把ADOConnection1的“LoginPrompt”设置为false。
设置ADODataSet1
Connection属性:选择ADOConnection1
CommandText:在弹出的对话框中输入“select * from ProductionData”
Active:true
设置DataSourse1
DataSet属性:ADODataSet1
设置DBGrid1
DataSourse属性:DataSourse1
经过上述设置后,窗体上的DBGrid1就显示出了表ProductionData的信息(见图1)。

而假设现在需要打印的情况是这样的:产品生产完成后需要立即给产品贴一张标签,注明此产品的基本信息,便于产品出厂外发,假设上例需要给产品贴的标签如图2所示,接下来我们就来看看如何让所需的数据出现在标签上。

2.将数据库数据导入标签
在你的程序的主窗体上根据需要放置N个Edit组件和Label组件,Label用于标记,Edit用于显示数据库的某一条记录的相应字段的值,如图2所示在窗体上需要放置8个Edit。再放置一个Button用于发送打印命令,最后放置RvProject1、RvSystem1这两个组件,它们在Rave组件页中。
如果要打印任意一条记录,首先需要在Edit中显示这条记录的相应字段的值,也就是显示DBGrid的指针指向的记录的字段的值,当选择DBGrid表格的任意一条记录时,Edit组件就显示这条记录的相应信息,实现方法如下:
在DBGrid的OnCellClick事件中写入如下代码:
procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
edtProductCoilNo.Text :=ADODataSet1.FieldByName('HOT_COIL_NO').AsString;
edtThick1.Text:=ADODataSet1.FieldBy Name('COIL_THICK').AsString;
edtWidth1.Text:=ADODataSet1.Field ByName('COIL_WIDTH').AsString;
edtPruductWeight.Text:=ADODataSet1.FieldByName('COIL_WEIGHT').AsString;
edtShift_No.Text:=ADODataSet1.Field ByName('Shift_No').AsString;
edtChecker.Text:=ADODataSet1.Field ByName('DUTY_PERSON').AsString; edt ProductTime.Text:=DateTimeToStr(ADO DataSet1.FieldByName('PRODUCTION_TI ME').AsDateTime);
end;
代码注释:上述代码的功能非常简单,也就是把当前指针所指向的记录的字段赋给Edit。
二、制作标签
现在我们可以着手制作标签了。双击RvProject1组件,打开Rave Report 5.0,新建一个文档并保存为Project1.rav,关闭Rave Report 5.0应用程序。
1.设置RvProject1的属性
RvProject1.Engine:= RvSystem1;
RvProject1.ProjectFile:点击属性的浏览按钮,将弹出一个对话框,选择刚才保存的Project1.rav(图3)。


2.设置RvSystem1的属性
RvSystem1.DefaultDest:= rdPreview;//打印预览,如果选择rdPrinter,则输出到打印机
小提示:建议在调试标签上的各个字符的相对位置时选择预览方式,调试完成投入使用时选择直接输出到打印机方式既节约生产时间又降低劳动强度。
SystemSetups.ssAllowSetup:=False;//不做打印机设置,如果为 True,则每次点击Button1执行打印命令时将弹出打印机设置对话框。
小提示:建议在调试期间选择True,设置完毕后改为False以减小劳动强度。打印机对话框设置如图4所示,在Report Destination组合框中,选择Printer,将输出到打印机;选择Preview,将显示打印预览;选择File,将以NDR或PRN方式保存文件。


3.设置Rave Report 5.0
双击RvProject1组件,打开Rave Report 5.0,在最右边找到“RaveProject→ReportLibrary→Report1”,并选择它,如图5所示。然后在左边的属性栏中找到Parameters,并点击浏览按钮(图6)。


在弹出的对话框中,设置8个参数,输入A1~A8。在Rave Report 5.0软件开发环境上方的组件页中选择Report组件页,在画布上放置8个此组件页的DataTest组件,并利用Alignment组件页的组件把各个DataTest排整齐。
选中第一个DataTest组件,找到属性DataField,并点击浏览按钮,将弹出一个对话框。点击Project Parameters下拉列表框,选择A1。然后点击“Insert Parameter”按钮,点击“OK”按钮退出。依次选择其余的DataTest组件,做相同的操作。经过设置后,画布如图7所示。保存并退出Rave Report 5.0。

三、输出打印标签
1.设计打印代码
制作完标签后,回到Delphi7.0开发环境,在主窗体的Button1中就可以输入打印代码了:
procedure TForm1.Button1Click(Sender: TObject);
begin
RvProject1.Open;
RvProject1.SelectReport('Report',true);
RvProject1.SetParam('A1',edtProduct CoilNo.Text);
RvProject1.SetParam('A2',edtThick1.Text);
RvProject1.SetParam('A3','*');
RvProject1.SetParam('A4',edtWidth1.Text);
RvProject1.SetParam('A5',edtPruduct Weight.Text);
RvProject1.SetParam('A6',edtShift_No.Text);
RvProject1.SetParam('A7',edtChecker.Text);
RvProject1.SetParam('A8',edtProduct Time.Text);
RvProject1.Execute;
RvProject1.Close;
end;
代码注释:上述代码的功能就是把Edit的值输出到打印机。
小提示:如果要打印一个常量(不从数据库读出数据),如参数A3传递的“*”,直接写为:RvProject1.SetParam('A3','*');当然也可以在属性设置中把Edit1的text设置为“*”,然后代码写为:RvProject1.SetParam('A3', Edit1.Text);
2.微调打印位置
最后由于不可能一次就能使字符打印在非常合适的位置,所以我们需要细心地根据打印的标签微调各个字符在标签的位置,直到满意为止。根据需要设置打印机后,再输入如下代码就可以了:
RvSystem1.DefaultDest:= rdPrinter;
SystemSetups.ssAllowSetup:=False;
小提示:在打印过程中会出现这种情况:在打印预览中显示的字符没有打印完全,比如在预览时的“产品价格”打印出来是“产品价”。这是由于标签设计时DataTest的长度不够造成的。打开Rave Report 5.0,调出保存的Project1.rav,把相应的DataTest的Wdith值改大就可以了。在预览方式下点击打印按钮也可以进行标签打印。