用Delphi编写小型数据库(四)——打印标签
编程爱好者
技术看点:数据库的格式化输出技巧、打印调试技巧
数据库编程有一个很重要的特点,通常需要把数据输出到打印机,比如生产线的成品出厂前需要贴上标签,财务报表做的数据统计结果需要打印给上司过目,这些都需要在Delphi中根据需要设计好打印功能。
一、标签打印
我们先来设计标签的打印输出,这里的Delphi版本为7.0,制作打印程序需要用到Rave组件板内的组件。
以攀钢热轧板厂纵切机组的程序为例,当生成一条实绩(成品信息)后,需要在钢卷出厂前给钢卷贴上包含此钢卷数据信息的标签,标签格式如图1所示,标签下面是成品表,当在成品表格中选择一条记录后,把成品表的字段的值写到标签的Edit控件中,这在第二章已经详细介绍过了,方法是在DBGrid的OnClick事件中写类似下面的代码:

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.FieldBy
Name('COIL_WIDTH').AsString;
edtPruductWeight.Text:=ADODataSet1.FieldByName('COIL_WEIGHT').AsString;
edtShift_No.Text:=ADODataSet1.FieldByName('Shift_No').AsString;
edtChecker.Text:=ADODataSet1.FieldByName('DUTY_PERSON').AsString; edtProductTime.Text:=DateTimeToStr(ADODataSet1.FieldByName('PRODUCTION_TIME').AsDateTime);
end;
这样,当被选择的记录的信息显示在Edit中后,只需要把Edit的内容按标签的实际大小输出到打印机就可以了。
找到Rave组件板,把RvProject1、RvSystem1添加到窗体上。
1.双击RvProject1组件,打开Rave Report 5.0,新建一个文档并保存为Project1.rav,关闭Rave Report 5.0应用程序。
2.设置RvProject1的属性:
RvProject1.Engine:= RvSystem1;
RvProject1.ProjectFile:点击属性的浏览按钮,将弹出一个对话框,选择上一步保存的Project1.rav。
3.设置RvSystem1的属性:
RvSystem1.DefaultDest:= rdPreview;//打印预览,如果选择rdPrinter,则直接输出到打印机。
建议在调试标签上各个字符的相对位置时选择预览方式,调试完成投入使用时选择直接输出到打印机方式能节省时间。
SystemSetups.ssAllowSetup:=False;//不做打印机设置,如果为 True,则每次点击Button1执行打印命令时将弹出打印机设置对话框,建议在调试期间选择True,设置完毕后改为False以减小劳动强度。在Output Options对话框的Report Destination组合框中(图2),选择Printer,将输出到打印机;选择Preview,将显示打印预览;选择File,将以NDR或PRN方式保存文件。

点击Setup按钮后将弹出标准打印机设置对话框,这里不作阐述。
4.双击RvProject1组件,打开Rave Report 5.0。
(1)找到RaveProject→ReportLibrary→Report1,并选择它(图3)。然后在左边的属性栏中找到Parameters,并点击浏览按钮。

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

保存并退出Rave Report 5.0。
5.设计完标签后,回到Delphi7.0开发环境,在主窗体的Button1中写打印代码:
procedure TForm1.Button1Click(Sender: TObject);
begin
RvProject1.Open;
RvProject1.SelectReport('Report',true);
RvProject1.SetParam('A1',edtProductCoilNo.Text);
RvProject1.SetParam('A2',edtThick1.Text);
RvProject1.SetParam('A3','*');
RvProject1.SetParam('A4',edtWidth1.Text);
RvProject1.SetParam('A5',edtPruductWeight.Text);
RvProject1.SetParam('A6',edtShift_No.Text);
RvProject1.SetParam('A7',edtChecker.Text);
RvProject1.SetParam('A8',edtProductTime.Text);
…………
RvProject1.Execute;
RvProject1.Close;
end;
上述代码的功能就是把Edit的值输出到打印机。
有一点要说明:如果要打印一个常量(不从数据库读出数据),如参数A3传递的“*”,直接写为:RvProject1.SetParam('A3','*');
当然,也可以在属性设置中把Edit1的text设置为“*”,然后代码写为:
RvProject1.SetParam('A3', Edit1.Text );
注意二者之间的差别。
6.最后一步是水磨功夫,由于不可能一次就使字符打印在非常合适的位置,所以就要细心地根据打印的标签微调各个字符在标签中的位置,直到满意为止。然后设置打印机,设置完毕后做下面的设置:
RvSystem1.DefaultDest:= rdPrinter;
SystemSetups.ssAllowSetup:=False;
在打印过程中会出现这种情况:在打印预览中显示的字符没有都打印出来。这是由于标签设计时,DataTest的长度不够,打开Rave Report 5.0,调出保存的Project1.rav,把相应的DataTest的Wdith值改大就可以了。另外,在预览方式下点击打印按钮也可以进行标签打印。
二、报表输出
下面讲解如何把报表输出到打印机,这里所说的报表也就是一个数据集内的数据,制作复杂的报表有专门的工具,比如著名的水晶报表软件,我们这里不讨论复杂的报表,只说明Delphi如何把我们需要的数据以表格形式打印出来。
假如我们需要把图5这张表格打印出来,可以首先在Rave组件板中把RvProject

1、RvDataSetConnection1添加到窗体上,在窗体上双击RvProject1,启动报表设计器。
1.选择“File”菜单下的“New”命令建立新报表工程。
2.选择“File”菜单下的“New Data Object”命令后,出现“Data Connections”窗口。选择“Direct Data View”后,按“Next”按钮,选择“TRvDataConnection1”后,按“Finish”键后退出到主设计界面。
3.选择“Tools”→“ Report Wizards”→“ Simple Table”后,出现“Simple Table”窗口。选择“DataView1”后,按“Next”按钮,选择需要的字段后,一路按“Next”按钮,最后按“Generate”按钮,出现如图6所示的界面。

4.设置报表头、报表栏目和各种元件的布局后,存盘退出报表设计器。
5.在Delphi开发环境中,在“Print”按钮中录入下面代码:
procedure TForm1.Button1Click(Sender: TObject);
begin
RvProject1.Open;
RvProject1.SelectReport('Report',true);
RvProject1.Execute;
RvProject1.Close;
end;
6.运行程序,点击“Print”按钮,在弹出的对话框中选择预览,我们就能看见报表打印预览效果。点击“打印”按钮即可把报表打印出来了。