- 浏览: 140578 次
- 性别:
-
文章分类
最新评论
一、概述
在银行,税务,邮政等行业的实际工作中,经常涉及到在印刷好具有固定格式的汇款单,储蓄凭证,税票等单据上的确定位置打印输出相关的信息。在此类需求中,精确地定位单据并打印相关信息,是解决问题]的关键。一般情况下,开发者都是通过在打印机上通过重复的测试来达到实际需求。那么,有没有简单有效而又灵活的方法实现上述功能呢?
二、基本思路
分析上述单据的特征,可以发现:此类打印输出的信息一般比较简短,不涉及到文字过长的折行处理,另外,其打印输出的位置相对固定。因此,我们可以通过用尺子以毫米为单位,测量好每个输出信息位置的横向和纵向坐标,作为信息输出的位置。但由于不同打印机在实际输出效果上,总是存在理论和实际位置的偏差,因此,要求程序具有一定的灵活性,供最终用户根据需要,进行必要的位置调整。因此,可设置一打印配置文件,用于存储横坐标和纵坐标的偏移量,用于用户进行位置校正,从而提供了一定的灵活性。
三、精确打印输出的程序实现
1. 在Delphi中新建一个名为mprint.pas的单元文件并编写如下程序,单元引用中加入Printers略:
//取得字符的高度 function CharHeight: Word; var Metrics: TTextMetric; begin GetTextMetrics(Printer.Canvas.Handle, Metrics); Result := Metrics.tmHeight; end; file://取得字符的平均宽度 function AvgCharWidth: Word; var Metrics: TTextMetric; begin GetTextMetrics(Printer.Canvas.Handle, Metrics); Result := Metrics.tmAveCharWidth; end; file://取得纸张的物理尺寸---单位:点 function GetPhicalPaper: TPoint; var PageSize : TPoint; begin file://PageSize.X; 纸张物理宽度-单位:点 file://PageSize.Y; 纸张物理高度-单位:点 Escape(Printer.Handle, GETPHYSPAGESIZE, 0,nil,@PageSize); Result := PageSize; end; file://2.取得纸张的逻辑宽度--可打印区域 file://取得纸张的逻辑尺寸 function PaperLogicSize: TPoint; var APoint: TPoint; begin APoint.X := Printer.PageWidth; APoint.Y := Printer.PageHeight; Result := APoint; end; file://纸张水平对垂直方向的纵横比例 function HVLogincRatio: Extended; var AP: TPoint; begin Ap := PaperLogicSize; Result := Ap.y/Ap.X; end; file://取得纸张的横向偏移量-单位:点 function GetOffSetX: Integer; begin Result := GetDeviceCaps(Printer.Handle, PhysicalOffSetX); end; file://取得纸张的纵向偏移量-单位:点 function GetOffSetY: Integer; begin Result := GetDeviceCaps(Printer.Handle, PhysicalOffSetY); end; file://毫米单位转换为英寸单位 function MmToInch(Length: Extended): Extended; begin Result := Length/25.4; end; file://英寸单位转换为毫米单位 function InchToMm(Length: Extended): Extended; begin Result := Length*25.4; end; file://取得水平方向每英寸打印机的点数 function HPointsPerInch: Integer; begin Result := GetDeviceCaps(Printer.Handle, LOGPIXELSX); end; file://取得纵向方向每英寸打印机的光栅数 function VPointsPerInch: Integer; begin Result := GetDeviceCaps(Printer.Handle, LOGPIXELSY) end; file://横向点单位转换为毫米单位 function XPointToMm(Pos: Integer): Extended; begin Result := Pos*25.4/HPointsPerInch; end; file://纵向点单位转换为毫米单位 function YPointToMm(Pos: Integer): Extended; begin Result := Pos*25.4/VPointsPerInch; end; file://设置纸张高度-单位:mm 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 file://自定义纸张最小高度127mm if Value < 127 then Value := 127; file://自定义纸张最大高度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; file://设置纸张宽度:单位--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 file://自定义纸张最小宽度76mm if Value < 76 then Value := 76; file://自定义纸张最大宽度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_PAPERWIDTH; pDMode^.dmPaperSize := DMPAPER_USER; file://将毫米单位转换为0.1mm单位 pDMode^.dmPaperWidth := Value * 10; pDMode^.dmFields := pDMode^.dmFields or DMBIN_MANUAL; pDMode^.dmDefaultSource := DMBIN_MANUAL; GlobalUnlock(hDMode); end; end; Printer.PrinterIndex := Printer.PrinterIndex; end; file://在 (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 file://打开配置文件,读出横向和纵向偏移量 try Fn := TStringList.Create; FileName := ExtractFilePath(Application.ExeName) + ConfigFileName; if FileExists(FileName) then begin Fn.LoadFromFile(FileName); file://横向偏移量 OffSetX := StrToInt(Fn.Values['X']); file://纵向偏移量 OffSetY := StrToInt(Fn.Values['Y']); end else begin file://如果没有配置文件,则生成 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; file://因为是绝对坐标, 因此, 不用换算成相对于Y轴坐标 Px := Px + 2 * AvgCharWidth; Printer.Canvas.Font.Name := '宋体'; Printer.Canvas.Font.Size := FontSize; file://Printer.Canvas.Font.Color := clGreen; Printer.Canvas.TextOut(Px, Py, Txt); end; |
2. 使用举例
在主窗体中加入对mprint单元的引用,在一命令钮的OnClick事件中书写如下代码(用于在邮政汇款单上的相应方框内打印邮政编码843300):
Printer.BeginDoc; PrintText(16, 14, '8', 'config.txt'); PrintText(26, 14, '4', 'config.txt'); PrintText(36, 14, '3', 'config.txt'); PrintText(46, 14, '3', 'config.txt'); PrintText(56, 14, '0', 'config.txt'); PrintText(66, 14, '0', 'config.txt'); Printer.EndDoc; |
观察结果,用尺子测量偏移量,在config.txt文件中修改X,Y的值即可。
发表评论
-
Delphi中的接口和抽象类
2010-12-06 16:30 627接口:Interface Delphi中接口的关键字 ... -
Delphi编程中流的应用
2011-05-25 11:19 851一、流的概念 流简单说是建立在面向对象基础上的一种 ... -
Pascal与C的指针
2011-05-26 13:49 1085大家都认为,C语言 ... -
Delphi编程的一些资料1
2011-06-16 10:40 784手机 SMS PDU 格式参考手册 1.相关的GSM AT指 ... -
Delphi编程的一些资料2
2011-06-16 10:43 765算法步骤: 一、地址 ... -
Delphi编程的一些资料3
2011-06-16 10:46 830一、一般命令 AT+CGMI ... -
Delphi编程的一些资料4
2011-06-16 10:48 834七、追加服务命令 AT+CCFC 呼叫继续 ... -
Delphi编程的一些资料5
2011-06-16 10:53 818十三、SIM卡工具箱命令 AT+STSF ... -
短信文本模式下的解码方法
2011-06-16 10:57 847接收短信有两种编码格式: 1.中英文混合的为unicode 2 ... -
通过注册表获取当前所有串口号
2011-06-16 15:49 2767usesWindows, Messages, SysUtils ... -
Delphi 分隔GSMModem接收到的短信字符串
2011-06-20 10:37 1135Delphi 分隔GSMModem接收到的短信字符串 ... -
Delphi流的操作
2011-06-22 14:34 851Delphi流的操作 一、流的概念 流简单说是建立在面 ... -
Delphi、PChar和Char数组的比较
2011-06-22 16:14 1336Delphi、PChar和Char数组的 ... -
Delphi 判断数据库表是否存在
2011-06-26 12:54 1174//根据表名和一个数据库连接判断表是否存在 function ... -
Delphi ListView基本用法大全
2011-08-22 17:27 1429Delphi ListView基本用法大全 //增加项或列( ... -
Delphi2010 无效的类别字符串, ProgID: "ADOX.Catalog"问题
2012-07-18 09:56 2163程序中用ADOX创建的Access数据库,一直运行正常,其 ... -
Delphi 禁用TEdit右键菜单及复制粘贴
2012-07-19 11:24 1412Delphi 禁用TEdit右键菜单及复制粘贴简的单方法 ... -
Delphi TStrings取得Ini文件键值对
2012-07-20 07:37 1368Delphi TStrings取得Ini文件键值对的简单 ... -
Delphi 压缩Access数据库
2012-07-21 12:21 1745由于Access数据库在反复使用过程中会自动增大,Del ...
相关推荐
### 使用Delphi实现票据精确打印 #### 概述 在金融、税务以及邮政等行业中,经常需要在已印制好的单据(如汇款单、储蓄凭证、税票等)的固定位置上打印相关的信息。这种操作对于业务流程至关重要,因为它们确保了...
### Delphi票据打印知识点 #### 一、概述 在银行、税务、邮政等行业中,经常需要在具有固定格式的单据(如汇款单、储蓄凭证、税票等)上打印相关信息。为了确保打印信息的位置精确无误,通常需要解决以下几个关键...
vue3 访问通义千问聊天代码例子
基于Python的Flask-vue基于Hadoop的智慧校园数据共享平台实现源码-演示视频 项目关键技术 开发工具:Pycharm 编程语言: python 数据库: MySQL5.7+ 后端技术:Flask 前端技术:HTML 关键技术:HTML、MYSQL、Python 数据库工具:Navicat、SQLyog
【实验1】:读取一次AI0通道数值 【实验2】:一次读取AI0通道多个数值 【实验3】:单次模拟量输出 【实验4】:连续模拟量输出(输出一个正弦曲线)
无人船的Smith-PID跟踪控制方法研究及实现:融合传统与最优PID策略的LOS曲线跟踪资料,基于无人船Smith-PID改进跟踪控制技术及其LOS曲线跟踪方法研究资料,基于无人船的smith-pid跟踪控制资料。 首先,针对pid进行了改进,有传统pid,最优pid和基于smith的pid三种控制方式。 然后还在smithpid基础上设计了LOS的曲线跟踪方法。 (有对应参考文献)。 有意者可直接联系,参考学习资料。 python语言。 ,基于无人船的Smith-PID跟踪控制; PID改进(传统PID、最优PID、基于Smith的PID); Smith-PID曲线跟踪方法; 参考学习资料; Python语言。,基于无人船的Smith-PID优化跟踪控制资料
自研船舶电力推进系统MATLAB仿真报告:从柴油机+同步发电机到异步电机直接转矩控制的全面模拟与实践,《船舶电力推进系统自搭MATLAB仿真报告:从柴油机同步发电机到异步电机直接转矩控制的完整过程与参数配置详解》,自己搭建的船舶电力推进系统(船舶电力推进自动控制)完全自搭MATLAB仿真,可适度,含对应27页正文的中文报告,稀缺资源,仿真包括船舶电站,变流系统和异步电机直接转矩控制,放心用吧。 三个文件逐层递进 柴油机+同步发电机(船舶电站) 柴油机+同步发电机+不控整流全桥逆变 柴油机+同步发电机+变流模块+异步电机直接转矩控制 所有参数都是配好的,最大负载参考变流系统所带负载两倍,再大柴油机和同步发电机参数就不匹配了,有能力可以自己调 ,核心关键词:船舶电力推进系统; MATLAB仿真; 船舶电站; 变流系统; 异步电机直接转矩控制; 柴油机; 同步发电机; 不控整流全桥逆变; 参数配比。,《船舶电力推进系统MATLAB仿真报告》
西门子博图WinCC V15自动化系统项目实战:多服务器客户端下的PID DCS闭环控制及参数调整实战指南,西门子博图WinCC V15自动化系统项目实战:多服务器客户端下的PID DCS闭环控制及参数调整实战指南,西门子博图WinCC V 15大型自动化系统项目,包含多台服务器客户端项目,系统采用安全1516F -3PN DP 外挂多台精智面板,1200PLC ET200SP 变频器 对整个工艺过程PID DCS 闭环过程控制,如何调整温度压力流量液位等参数,实用工程项目案例 ,西门子博图WinCC V 15; 大型自动化系统; 多台服务器客户端; 安全外挂; 精智面板; 1200PLC ET200SP; 变频器; PID DCS; 闭环过程控制; 温度压力流量液位调整; 工程项目案例,西门子博图WinCC V15大型项目:多服务器客户端的PID DCS闭环控制与实用参数调整
内容概要:本文详尽介绍了计算机网络相关资源及其各方面构成要素,首先阐述了硬件层面的各种传输媒介和设备如双绞线、同轴电缆、光纤以及台式电脑、笔记本、大型计算机等设备,还包括网络互联所需的各类组件如网卡、交换机、路由器等。其次探讨了多种操作系统的特性和主要功能,以及各类通讯和支持应用程序的概述,涵盖浏览器、图像和视频编辑等常用软件。再深入讨论了多种常见网络协议如TCP、UDP、HTTP等的功能特性。最后还提到了确保网络安全运行的重要措施和工具如MIB、SNMP以及防火墙、入侵检测系统等。并且简要提到计算机网络在不同的应用环境,从局域网到移动网络。 适合人群:所有对计算机网络技术感兴趣的初学者和希望深入了解各个组成成分的技术人员. 使用场景及目标:为用户提供计算机网络资源全面而系统的认识,帮助他们建立对于该领域的理论和技术的扎实认知基础,提高在实际环境中识别配置及维护计算机网络系统的能力.
海神之光上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
ABAQUS中隧道结构模型的无限元应用:超声激励源的施加方法、3D无限元吸收边界的添加技巧、模型结果精确性校核流程及教学视频与CAE、INP文件解析,ABAQUS隧道模型中3D无限元吸收边界的应用:超声激励源的施加与模型结果精确性校核的实践教程,ABAQUS无限元吸收边界,abaqus隧道无限元,1.超声激励源施加;2.3D无限元吸收边界添加方法;3.模型结果精确性校核;4.提供教学视频,cae、inp文件。 ,ABAQUS无限元吸收边界;ABAQUS隧道无限元;超声激励源施加;3D无限元吸收边界添加;模型结果精确性校核;CAE和INP文件。,ABAQUS中超声激励下无限元吸收边界设置及模型精度验证教程
海神之光上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
git自用lllllllllllllllllll
本资源与文章【Django小白项目】为一体,此为已成功项目,供给给Django初学者做参考,有不会的问题可以私信我噢~
使用一维数据表示向量和二维矩阵,支持常用运算。
1、以上文章可用于参考,请勿直接抄袭,学习、当作参考文献可以,主张借鉴学习 2、资源本身不含 对应项目代码,如需完整项目源码,请私信博主获取
基于多目标粒子群优化算法(MOPSO)的微电网多目标经济运行分析与优化策略考虑响应侧响应的协同调度策略,基于多目标粒子群优化算法(MOPSO)的微电网经济调度优化:含风光储荷一体化模型与需求侧响应策略,考虑需求侧响应的微电网多目标经济运行 建立了含风光储荷的微电网模型,以发电侧成本(包括风光储以及电网的购电成本)和负荷侧成本最小为目标,考虑功率平衡以及储能SOC约束,建立了多目标优化模型,通过分时电价引导负荷需求侧响应,得到可削减负荷量,同时求解模型,得到风光储以及电网的运行计划。 这段代码是一个使用多目标粒子群优化算法(MOPSO)解决问题的程序。下面我将对程序进行详细的分析和解释。 首先,程序的目标是通过优化算法来解决一个多目标优化问题。程序中使用的优化算法是多目标粒子群优化算法(MOPSO),该算法通过迭代更新粒子的位置和速度来搜索最优解。 程序的主要功能是对能源系统进行优化调度,包括光伏发电、风力发电、储能和电网供电。程序的目标是最小化能源系统的成本,并满足负荷需求。 程序的主要思路是使用粒子群优化算法来搜索最优解。程序中定义了一个粒子类(Particle),每个粒子代
data.gov.sg geojson部分项目整理
基于MATLAB Simulink的避障功能欠驱动无人船航迹跟踪控制仿真实验研究,基于MATLAB Simulink的欠驱动无人船避障功能路径跟踪控制仿真实验研究,包含避障功能的欠驱动无人船航迹(路径)跟踪控制仿真实验,基于MATLAB Simulink制作 ,避障功能; 欠驱动无人船; 航迹(路径)跟踪控制; MATLAB Simulink 仿真实验; 避障算法。,基于MATLAB Simulink的避障无人船航迹跟踪控制仿真实验