打印模板,模块化DIY
技术与开发
我是一家复印店的员工,我们店经常需要打印各种证件和需要自定义的文件(例如标签、封条等),我们一般都使用一些打印模板,需要用时在模板里面修改。我设计了一个可以DIY设计各种打印模板的小程序(程序下载地址:http://www.shudoo.com/bzsoft,附加了常用打印模板),利用我的程序可以使用已有的打印模板,也可以快速模块化设计新的打印模板。

店面需求:我们店时常要打印各种证件或者特定文件(例如标签、封条),这些东西很多都是针对个人或者某家单位的,需要单独设计,可以动态调整打印内容的坐标。
软件原理:使用报表设计器来实现。在主窗体上设计五个输入框后(输入框数量可以根据实际需要变化),制作一个报表文件,在报表文件中设置五个打印文本并和主窗体上的输入框一一挂钩,然后在主窗体上设置四个按钮用于动态调整报表中打印文本的坐标并保存在INI文件中,打印时读取INI文件中各个打印文本的坐标后,输出内容。
技术要点:获取打印文本的坐标是本软件的核心。报表设计器中打印文本的坐标和主窗体上输入框的坐标的获取方法不一样,我们首先需要抓取报表设计器中的打印页,然后在打印页中获取具体的每个打印文本,获取之后对文本的top属性和left属性进行读写操作即可。
软件开发步骤
第一步:启动Delphi7.0,新建一个工程,在Form1窗体上添加六个dit、五个RadioButton、五个Button(用于调整输入框的打印坐标等)、一个RvSystem、一个RvProject(报表设计器的控件),并在项目文件夹下新建一个zuobiao.ini(用于存储报表设计器中每个控件的坐标)。
第二步:在报表设计器中设计打印文本的属性。在报表设计器中设计五个打印文本控件,在主窗体上的五个输入框中输入文字,比如姓名、性别后,程序将调用报表设计器中的控件坐标等属性进行打印。
方法如下:首先在Form1窗体上双击RvProject,启动报表设计器Rave Report 5.0,新建一个文档并保存为zhengjian.rav,然后在报表设计器的最右边找到“RaveProject→ReportLibrary→Report1”。
在左边的属性栏中找到Parameters,并点击“浏览”按钮,在弹出的对话框中,设置五个参数,输入A1-A5(每输入一个参数要回车),输入后关闭对话框。
之后在报表设计器的组件面板中选择“Report组件页”,在画布上放置五个DataTest组件,并利用Alignment组件页的组件把各个DataTest组件对齐。
最后选中第一个DataTest组件,找到属性DataField,并点击浏览按钮,将弹出一个对话框,点击Project Parameters下拉列表框,选择“A1”,然后点击“Insert Parameter”按钮,点击“OK”按钮退出。依次选择其余的DataTest组件,做相同的操作。
第三步:关闭报表设计器,回到Form1窗体,在主窗体上点击“打印”按钮时读出zuobiao.ini中的数据,然后把这些数据赋值给报表中五个输入框的坐标属性。输入相关代码,其中主要代码如下(完整代码下载地址:http://www.shudoo.com/bzsoft):
RvProject1.ProjectFile:= ExtractFilePath(Application.ExeName)+'zhengjian.rav'; //连接报表文件
RvProject1.Open;
RvProject1.SelectReport('Report',true);
zuobiaoIni := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'zuobiao.ini');//读取ini文件
RvProject1.SetParam('J1',Edit1.Text);//输入框和报表设计器中的打印文本挂钩
MyText.Top:=StrToFloat(zuobiaoIni.ReadString('打印模板', '输入框1Top',''));//改变'DataText1'在报表设计器中的位置
MyText.Left:=StrToFloat(zuobiaoIni.ReadString('打印模板', '输入框1Left',''));
zuobiaoIni.Free; //释放ini文件
RvProject1.Execute;//执行操作
第四步:调整报表设计器中每个控件的位置,并把坐标保存下来。我们利用单选框来定位选择的是哪个控件,当定位好控件后,首先读取INI文件中每个打印文本的left值和top值并赋值给各个控件。
接着抓取报表设计器页面中的某个文本控件,抓取后根据Form中设置的移动像素来改变其坐标,最后把坐标存储到INI文件中。“上移”按钮的核心代码如下:
zuobiaoIni := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'zuobiao.ini');//打开ini文件
movepointup:=StrToFloat(edtmove.Text);//读取主窗体上设置移动像素的值
MyText.Top:=StrToFloat(zuobiaoIni.ReadString('打印模板', '输入框1Top',''));//把ini文件中的top值写给'DataText1'的top属性
MyText.Left:=StrToFloat(zuobiaoIni.ReadString('打印模板', '输入框1Left',''));
if RadioButton1.Checked then//如果第一个单选框被选择
MyText.Top:=MyText.Top-StrToFloat(edtmove.Text);//
Edit1.SetFocus;//把Form1的Edit1设置焦点,醒目让人知道现在调整的是第一个输入框
zuobiaoIni.WriteString('打印模板', '输入框1Top', FloatToStr(MyText.Top));//新坐标写到ini文件中
第五步:提供可以调整edtmove输入框坐标的功能。此外,我们也可以制作多个模板,把不同模板的输入框的文本的位置都存储在INI文件中,需要打印什么就调用相应的模板打印即可(模板已经附加在程序中了,大家可以补充)。
编后
此软件通过抓取报表设计器中控件来实现调整打印文本的坐标。根据相似的原理,我们还可以制作出DIY画册等。