打印池

餐饮行业,打印池是必要的部件。

实现原理:每一台打印机都有自己的任务队列和处理任务队列的线程。

 

unit untPrintTask;

interface

uses
System.SysUtils, System.Classes,
Datasnap.DBClient, frxclass,
System.Generics.Collections;

type
TBillContent = record // 小票内容
machineNo: string; // POS机号
skyName: string; // 收款员姓名
saleNo: string; // 小票号
saleTime: TDateTime; // 销售时间
amount: Currency; // 应收
pay: Currency; // 支付
change: Currency; // 找零
prnData: OleVariant; // 小票明细:商品名称、单价、数量、金额。。。。。。
deskNo:string; // 台号
payType: string; // 支付方式
end;

type
TPrinterInfo = record // 打印机信息
prnNo: Integer; // 印机编号
prnName: string; // 印机名称
prnType: string; // 结账、厨打
prnWidth: Integer; // 50mm\76mm\80mm
remark: string; // 备注
prnModel: string; // 打印模版
end;

type
TOneTimePrint = record // 一次打印
printerInfo: TPrinterInfo; // 打印机信息
billContent: TBillContent; // 小票内容
end;

type
TPrintTaskThread = class(TThread) // 打印任务线程
private
FPrintQueue: TQueue<TOneTimePrint>; // 打印队列
protected
procedure Execute; override;
public
constructor Create; overload;
destructor Destroy; override;
property PrintQueue: TQueue<TOneTimePrint> read FPrintQueue
write FPrintQueue;
end;

var
g_PrintTasks: TDictionary<string, TPrintTaskThread>; // <打印机名字, TPrintTask>

implementation

{ TPrintTask }

uses untFastReport, UntSysConst;

constructor TPrintTaskThread.Create;
begin
Create(False);
FreeOnTerminate := False;
// 创建打印队列
FPrintQueue := TQueue<TOneTimePrint>.Create;
end;

destructor TPrintTaskThread.Destroy;
begin
// 释放打印队列
FreeAndNil(FPrintQueue);
inherited;
end;

procedure TPrintTaskThread.Execute;
var
OneTimePrint: TOneTimePrint;
dm: TdmFastReport;
c: TfrxComponent;
begin
while not Self.Terminated do
begin
if Assigned(FPrintQueue) and (FPrintQueue.Count > 0) then
begin
// 从任务队列中提取一个任务
OneTimePrint := FPrintQueue.Dequeue;
dm := TdmFastReport.Create(nil);
try
try
// 小票明细数据
dm.cds.Data := OneTimePrint.billContent.prnData;
// 小票模板
dm.report.LoadFromFile(OneTimePrint.printerInfo.prnModel);
// 哪个打印机
dm.report.PrintOptions.Printer := OneTimePrint.printerInfo.prnName;
// 变量赋值

c:=dm.report.FindObject('mmShopName');
if c<>nil then
TfrxMemoView(c).Memo.Text := UserInfo.ShopName;

c := dm.report.FindObject('mmMachineNo');
if c<>nil then
TfrxMemoView(c).Memo.Text := OneTimePrint.billContent.machineNo;

c:=dm.report.FindObject('mmSKY');
if c<>nil then
TfrxMemoView(c).Memo.Text := OneTimePrint.billContent.skyName;

c:= dm.report.FindObject('mmBillNo');
if c<>nil then
TfrxMemoView(c).Memo.Text := OneTimePrint.billContent.saleNo;

c:=dm.report.FindObject('mmSaleTime');
if c<>nil then
TfrxMemoView(c).Memo.Text := FormatDateTime('yyyy-mm-dd hh:nn',OneTimePrint.billContent.saleTime);

c:= dm.report.FindObject('mmDeskNo');
if c<>nil then
TfrxMemoView(c).Memo.Text := OneTimePrint.billContent.deskNo; // 台号

c:= dm.report.FindObject('mmPayType');
if c<>nil then
TfrxMemoView(c).Memo.Text := OneTimePrint.billContent.payType;

c:= dm.report.FindObject('mmAmount');
if c<> nil then
TfrxMemoView(c).Memo.Text := FormatCurr('0.00', OneTimePrint.billContent.amount);

c:=dm.report.FindObject('mmPay');
if c<>nil then
TfrxMemoView(c).Memo.Text := FormatCurr('0.00', OneTimePrint.billContent.pay);

c:= dm.report.FindObject('mmGiveChange');
if c<> nil then
TfrxMemoView(c).Memo.Text := FormatCurr('0.00', OneTimePrint.billContent.change);

// 开始打印
dm.report.PrepareReport();
dm.report.Print;
except
// 打印失败,重新加入任务队列
Self.FPrintQueue.Enqueue(OneTimePrint);
end;
finally
FreeAndNil(dm);
end;
end;

Sleep(1);
end;
end;

end.

转载于:https://www.cnblogs.com/hnxxcxg/p/5266512.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/255810.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAXB vs XStream

2019独角兽企业重金招聘Python工程师标准>>> JAXB vs XStream 博客分类&#xff1a; java JAXB vs XStream 这两东东本质上是有差别的&#xff0c;JAXB称为OX binding工具&#xff0c;XStream应该算序列化工具&#xff0c;但OX binding工具也会marshall和unmarsha…

ABB 机器人 DRVIO_1通信报警

ABB 机器人DRVIO_1通信报警 2014.06.13 ABB1600弧焊机器人&#xff0c;从A地搬运到B地&#xff0c;到达B地后&#xff0c;机器人上电&#xff0c;报DRVIO_1通信故障&#xff0c;机器人进入故障停止模式。 DRVIO_1为LOCAL_GENERIC类型的ABB内部LOCAL总线类型的单元实例。 故障…

S2SH CRUD 整合

S2SH CRUD 整合 采用的框架 Struts2Spring4Hbiernate4. 目录结构 &#xff1a; EmployeeAction: 1 package com.xx.ssh.actions;2 3 import java.io.ByteArrayInputStream;4 import java.io.InputStream;5 import java.io.UnsupportedEncodingException;6 import java.util.…

ABB 机器人 添加多任务

首先&#xff0c;需要启用多任务选项的控制器。 要做到这一点&#xff0c;创建一个新的机器人控制器RobotStudio站 - >选择机器人&#xff08;控制器菜单&#xff09; - >.................. - >系统生成器 - >选择控制器 - >修改...下一页 - >下一步 - >…

poj2594(二分图,最小路径覆盖变形)

Treasure ExplorationTime Limit: 6000MS Memory Limit: 65536KTotal Submissions: 7611 Accepted: 3126Description Have you ever read any book about treasure exploration? Have you ever see any film about treasure exploration? Have you ever explored treasure? …

【机器视觉】——相机镜头篇

目录 一、相关概念 1、相机 2、镜头 二、相关参数 1、相机参数 1)芯片尺寸

闭包(计算机科学)

在计算机科学中&#xff0c;闭包&#xff08;Closure&#xff09;又称词法闭包或函数闭包。是引用了自由变量的函数。这个被引用的自由变量将会和函数在一起。即使离开了创建它的环境也不例外。所以另一种关于闭包的说法&#xff1a;由函数和其引用相关的环境构成的实体。闭包在…

C语言小机器人

[cpp] view plaincopyprint? # include <stdio.h> # include <stdlib.h> # define MAXSTR 200 # define REBOT "小C说: " # define YOUR "您 说: " # define EXIT "-e\n" # define NOREPLY "我不知道你说什么呢…

分享12306抢票心得-终极秒杀思路篇

12306抢票的关键拼的就是整点出票的速度&#xff0c;快的几秒钟&#xff0c;慢的几分钟&#xff0c;本文提供终极抢票攻略&#xff0c;通过多线程扫描上万个CDN&#xff0c;来大幅度提升出票速度。准备一&#xff1a;需要了解CDN和切站的机制&#xff0c;请参考&#xff1a;分享…

JVM内幕:Java虚拟机详解

为什么80%的码农都做不了架构师&#xff1f;>>> 这篇文章解释了Java 虚拟机&#xff08;JVM&#xff09;的内部架构。下图显示了遵守 Java SE 7 规范的典型的 JVM 核心内部组件。 上图显示的组件分两个章节解释。第一章讨论针对每个线程创建的组件&#xff0c;第二章…

【机器视觉】——光源篇(分类、选型)

目录 ​ 一、光源相关知识 1、光的作用 2、光的颜色 二、光源的种类

ABB机器人 系统参数配置

系统参数用于定义系统配置并在出厂时根据客户的需要定义。 可使用 FlexPendant 或 RobotStudio Online 编辑系统参数。 此步骤介绍如何查看 系统参数配置。 操作 &#xff1a; 1. 在 ABB 菜单上&#xff0c;点击控制面板。 2. 点击配置。显示选定主题的可用类型列表。 3. 点…

MFC BCGControlBar 库 使用方法

安装 BCGControlBar 库到你的计算机&#xff1a; 解压缩 BCGControlBar.zip &#xff08;比如&#xff0c;到 c:\bcg 目录中&#xff09;把 c:\bcg\bin 增加到你的 path 环境变量中&#xff0c;运行 Visual C 并且打开 Tools | Options 对话框&#xff0c;切换到Directories 页…

四则运算2开发简介

四则运算2在四则运算1的基础之上&#xff0c;又添加了新的功能&#xff0c;但是我觉得四则运算2的难度比四则运算1增大了很多&#xff0c;我在编程的过程中&#xff0c;遇到的最大难度就是不知该如何更好的融合各个功能之间的关系。 写到现在&#xff0c;四则运算2主要实现了以…

ABB机器人的 备份与恢复

保存内容 备份功能可保存上下文中的所有系统参数、系统模块和程序模块。 备份内容 数据保存于用户指定的目录中。 默认路径可加以设置。 目录分为四个子目录&#xff1a;Backinfo、Home、Rapid 和 Syspar。 System.xml 也保存于包含用户设置的 ../backup &#xff08;根…

flask项目开发中,遇到http 413错误

在flask项目中&#xff0c;上传文件时后台报http 413 Request Entity Too Large 请求体太大错误&#xff01; 解决的2种方法&#xff1a; 1.在flask配置中设置 MAX_CONTENT_LENGTH的值; 如设置为20M ( MAX_CONTENT_LENGTH20*1024*1024) 这时小于20M的文件都可以上传 相关连接&…

【机器视觉】——畸变与矫正

目录 一、什么是畸变?畸变的原因是什么? 1、径向畸变(桶形畸变和枕形畸变)

ApplicationContextAware 接口

一、这个接口有什么用&#xff1f; 当一个类实现了这个接口&#xff08;ApplicationContextAware&#xff09;之后&#xff0c;这个类就可以方便获得ApplicationContext中的所有bean。换句话说&#xff0c;就是这个类可以直接获取spring配置文件中&#xff0c;所有有引用到的be…

Java之泛型练习

package cn.itcast.generics;import java.util.Comparator; import java.util.Iterator; import java.util.TreeSet;/** 方法一&#xff1a;实现Comparable接口*/ //class Person implements Comparable<Person> {//实现Comparable接口&#xff0c;使得集合元素具备可比较…