在Delphi中使用Zebra条码打印机打印中文

在Delphi中使用条码打印机打印中文标签时,由于多数打印机无内置中文字体,需要通过一个动态库fnthex32.dll(据说该动态库是Zebra公司整出来的)来把中文转换成16进制图形,然后再发送到打印机上。网络上可以找到一些如何使用该动态库的例子,这里也贴一个:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, strutils;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Edit1: TEdit;
    cbx1: TComboBox;
    Edit2: TEdit;
    cbx2: TComboBox;
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    Memo2: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
function GETFONTHEX(chnstr: string; fontname: string; orient: integer; height: integer; width: integer; bold: integer; italic: integer; hexbuf: string): integer; stdcall; external 'fnthex32.dll';
function PrtChnStr(x, y: integer; fontname: string; height, xmf, ymf: integer; chnstr: string): string;

var
  Form1: TForm1;

implementation

{$R *.dfm}
function PrtChnStr(x, y: integer; fontname: string; height, xmf, ymf: integer; chnstr: string): string;
var
  buf, ret: string;
  count: integer;
begin
  result := '';
  setlength(buf, 21 * 1024);
  count := GETFONTHEX(chnstr, fontname, 0, height, 0, 1, 0, buf);
  if count > 0 then
  begin
    ret := Copy(buf, 1, count);
    result := ret + '^FO' + inttostr(x) + ',' + inttostr(y) + '^XGOUTSTR01,' + inttostr(xmf) + ',' + inttostr(ymf) + '^FS';
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  prtstr, code: string;
begin
  if cbx1.Text = 'Code 11' then
    code := '^B1'
  else if cbx1.Text = 'Code 39' then
    code := '^B3'
  else if cbx1.Text = 'Code 49' then
    code := '^B4'
  else if cbx1.Text = 'Code 93' then
    code := '^BA'
  else if cbx1.Text = 'Code 128' then
    code := '^BC'
  else if cbx1.Text = 'EAN-8' then
    code := '^B8';
  prtstr := '^XA^IA6^XZ^FS^XA^FS^BY3,3^LH20,23^FS';
  prtstr := prtstr + '^FO' + '30,25' + code + ',' + '70^FD' + trim(Edit1.Text) + '^FS';
  prtstr := prtstr + PrtChnStr(10, 140, pchar(cbx2.Text), 14, 1, 2, pchar(Leftstr(Edit2.Text, 18)));
  prtstr := prtstr + '^PQ1^FS'; //打印1份
  prtstr := prtstr + '^PRC^FS^XZ^FS^XA^EG^XZ'; //打印结束
  Memo1.lines.clear;
  Memo1.lines.Add(prtstr);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  prtstr: string;
  filehandle: integer;
begin
  prtstr := Memo1.Text;
  filehandle := fileopen('LPT1', fmOpenWrite);
  if filehandle > 0 then
    filewrite(filehandle, prtstr[1], length(prtstr))
  else
    showmessage('打开并口错误');
  fileclose(filehandle);
end;
end.

 该例子在Delphi7里运行的挺好,可是在Delphi2010上却无法正常转换。原因是在Delphi2010中默认把String都当成UnicodeString来处理。通过把转换函数的接口强制声明为AnsiString可解决该问题。

一、函数声明改为:

function GETFONTHEX(chnstr: AnsiString; fontname: AnsiString; orient: integer; height: integer; width: integer; bold: integer; italic: integer; hexbuf: AnsiString): integer; stdcall; external 'fnthex32.dll';

 二、调用位置改为:

function PrtChnStr(x, y: integer; fontname: string; height, xmf, ymf: integer; chnstr: string): string;
var
  buf, ret: AnsiString;
  count: integer;
begin
  result := '';
  setlength(buf, 21 * 1024);
  count := GETFONTHEX(AnsiString(chnstr), AnsiString(fontname), 0, height, 0, 1, 0, buf);
  if count > 0 then
  begin
    ret := Copy(buf, 1, count);
    result := ret + '^FO' + inttostr(x) + ',' + inttostr(y) + '^XGOUTSTR01,' + inttostr(xmf) + ',' + inttostr(ymf) + '^FS';
  end;
end;

 

zebra(斑马)PDA扫码uniapp程序小demo 前言: 折腾了将近一天,汗。这方面小白的我终于完成了一个小demo,喜。 简单记录下,希望对这方面有需求的人有所帮助。 正文 PDA设置 (参考官网https://techdocs.zebra.com/datawedge-cn/7-0/guide/api/tutorials/) 1.在设备上启动 DataWedge。 2.新建配置文件 3.配置 DataWedge 输入(条码扫描器)和输出 (Intent)。 其中配置 Intent 输出注意: Intent 操作:com.dwexample.ACTION 阅读详情

相关推荐

斑马打印机-中文打印

中文打印 通常有两种方式 1、使用字体库,代价高,使用简单速度快 2.通过图片方式打印,免费使用,速度适中 官方有下载Fnthex32.dll https://download.youkuaiyun.com/download/qq598235031/11357248 我这里提供一个,本人亲自试验在win7 64位 win10 64位操作系统上 商业正式使用。 接下来重点介绍,如何使用Fnth...

3566

delphi:斑马打印机ZPL指令打印中文及二维码

一、中文生成BMP图片,需要注意的BMP图片要使用1BIT的,主要是下载快,图像清晰         使用GetTextExtentPoint32函数获取中文字符的长和高后设置为BMP的width和height        这样图片大小就和文字大小完全样了        function PrintBMP(const bmp:Tbitmap):boolean; var p: pbyte

xionw的专栏 1万+

Delphi实现斑马打印机条码与二维码打印完整方案

每一个有效的ZPL标签必须被包裹在^XA与^XZ之间。^XA表示“Start Format”,即启动一个新的标签格式;^XZ表示“End Format”,结束当前格式并触发打印动作。这两条指令构成了ZPL程序的基本框架。^XA^XZ上述代码展示了最简单的标签结构:第一行为文本“Hello World”,第二行为Code 128条形码。下面对关键部分进行逐行解析:^XA:开启标签格式。^FO50,50。

weixin_28913879的博客 1080

汉字、图形,Zebra打印机完全解决方案

 汉字、图形,Zebra打印机完全解决方案最近在做一个项目,使用Zebra Z4M Plus打印机打印访客人员卡片。以前用过不少打印机,普通的就不说了,证件类的如DataCard等。打印方式使用的是标准的Windows打印。可以很容易的集成进我们开发的绘图程序。这次第一次使用Zebra的打印机,熟悉了1天后,发现用标准的Windows打印简直是不可能。即使是使用了Zebra的ZebraDe

superjoel的专栏 1万+

Delphi环境下的Zebra打印机条形码打印操作实例

Delphi,作为编程语言和集成开发环境(IDE)的组合,自1995年首次发布以来,已经成为了开发高性能、跨平台应用程序的首选工具之一。它以快速开发、代码可读性高以及对象导向的特性,深受开发者的青睐。在本小节中,我们将对Delphi的发展历程及其各个主要版本进行回顾,以便更好地了解Delphi的发展脉络和技术演进。在当今高度数字化的世界中,条形码打印机如Zebra发挥了巨大的作用,它们在许多行业中用于自动化数据收集和标识。Zebra打印机之所以在这些领域广受欢迎,是因为它们的高效性、可靠性和易用性。

weixin_36231030的博客 921

Zebra打印实例Delphi

利用zebra命令打印条码的delphi实例

Delphi 调用打印指令ZPL--USB

如果是USB接口连接打印机的话有两种方法:   1、在CMD窗口下将USB虚拟成LPT 第一步,配置网卡的IP地址,指定一个固定IP与子网掩码; 第二步,共享USB接口的条码打印机,记得起一个简单易记的名字,这个是打印机共享名, 我的打印机起名叫GP5860 ; 第三步,映射出刚才共享的打印机到LPT1端口,在命令行端口运行NET USE LPT1: //计

Tianqin20140902的专栏 4381

DELPHI调用打印机打印图片的例子

在DELPHI中如何调用打印机打印图片的例子。

Delphi 调用打印机指令ZPL实例--并口

// 通过指令发送数据到打印机 function TForm1.SendToPrinter():Boolean; var hHandle: THandle; hModule: THandle; hEObject: THandle; WOverlapped: OVERLAPPED; DataStr: string; Buffer: PChar; nLengt

Tianqin20140902的专栏 3050

delphi7打印条形码例子

一个delphi7打印条形码的例子 希望对大家有帮助

delphi调用label matrix

delphi调用label matrix

ZPL指令说明文档-中文版下载:全面掌握Zebra打印机编程,助力标签打印设计

ZPL指令说明文档-中文版下载:全面掌握Zebra打印机编程,助力标签打印设计 去发现同类优质开源项目:https://gitcode.com/ ZPL指令说明文档-中文版下载,为您提供Zebra打印机编程语言的全方位指南。 项目介绍 在众多打印机编程语言中,Zebra Programming Language(ZPL)以其高效、灵活的特点而独树一帜。《ZPL指令说明文档-中文版》是一个开源项目,...

gitblog_06701的博客 492

【AutoSar CP】SoAd模块

比如对于特定的PDU,其PduId在程序编译时就确定了,但是在代码运行中,该PduId可能需要发送到不同的远端ip,这时就需要用SoAd来设置连接远端地址信息。SoAdSocketConnectionGroup(连接参数)SoAdSocketRoute(接收数据)SoAdRoutingGroup(开关)SoAdPduRoute(发送数据)

至道无难,唯嫌拣择。 1686

fnthex32.dll :尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

16年时候项目中也要用的斑马打印机打印中文汉字的要求,想借鉴这个控件(Fnthex32.dll)来完成,无奈都失败啦,后来是用C# 写成类给vb6.0调用把文本写在txtbox中,再生产图片,然后系列化解决的这个问题。 最近用c# 重写这个斑马打印程序,就又想起这个控件,于是就决定重新研究一下,网上的基本都是9个参数(报错:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。)。无奈怎么都不成

fathing的博客 4179

Python实现飞书机器人定时发送文本、图片等群消息

python实现飞书群自动发送告警消息

tyh_keephunger的博客 2万+

R语言绘图进阶:五大工具高效组合多图(cowplot、patchwork、layout、par、gridExtra)

本文详细介绍了R语言中五大高效组合多图的工具:cowplot、patchwork、layout、par和gridExtra。针对不同场景提供了实用指南,帮助数据分析师解决图表排版难题,提升报告专业度。特别推荐cowplot用于ggplot2图形组合,patchwork提供最简洁语法,layout则支持完全自定义布局。

weixin_42544663的博客 288

C#调用斑马打印机打印条码标签(支持COM、LPT、USB、TCP连接方式和ZPL、EPL、CPCL指令)

在批量打印商品标签时一般都要加上条码或图片,而这类应用大多是使用斑马打印机,所以我也遇到了怎么打印的问题。 一种办法是用标签设计软件做好模板,在标签设计软件中打印,这种办法不用写代码,但对我来说觉得不能接受,所以尝试代码解决问题。 网上搜索一番,找不到什么资料,基本都是说发送ZPL、EPL指令到打印机,而且还是COM/LPT口连接打印机。后来研究.net的打印类库,发现是用绘图方式打印

Ryan Z 的技术日志 7189

5G NR 帧结构

本节主要介绍5G NR中的帧结构[38.211-4.3]。5G帧结构(Frame Structure)为时域结构。其设计比其4G LTE更为灵活,这种灵活性使5G能够根据应用需求(如增强移动宽带eMBB,超高可靠低时延通信URLLC)进行调整,同时支持差异化的应用场景,提高了5G的利用效率与响应能力。具体而言,5G帧结构是基于时隙和OFDM符号设计的,且5G网络能够根据服务需求动态调整各时隙持续时长。

夫子喵的博客 5286

Delphi调用驱动打印

前言我们做打印小票的时候除了直接对端口发送指令的方式,还有就是调用打印机驱动打印的方式,在Delphi中想要用驱动打印的方式就可以用到TPrinter类TPrinter类介绍TPrint...

Vaccae的博客 1203

别再死记硬背公式了!用ADS手把手教你仿真一个4GHz镜像抑制混频器(附完整工程文件)

本文详细介绍了使用Keysight ADS软件设计和仿真4GHz镜像抑制混频器的完整流程。从理论分析到实际工程实现,涵盖分支线耦合器设计、二极管建模、噪声系数仿真及性能优化等关键步骤,帮助工程师摆脱公式死记硬背,掌握实用的射频电路设计技能。附完整工程文件,可直接应用于实际项目开发。

weixin_28683391的博客 495

在 RAP 里把编号这件事做得既优雅又合规:Early Numbering 与 Late Numbering 的落地指南

本文探讨了 SAP RAP 框架中的三种主键编号策略及其适用场景。文章首先指出传统 ABAP 应用中主键处理的局限性,详细分析了早期编号(外部/内部)和延迟编号的差异,强调延迟编号在避免业务断号方面的优势。通过 Partner 业务对象案例,文章演示了延迟编号的实现方法,包括行为定义配置、保存类实现和编号分配逻辑。同时指出测试中常见的校验陷阱,并提醒生产环境应避免简单的 MAX+1 方案,建议采用原子取号机制确保并发安全。全文从业务合规性和技术实现两个维度,为 RAP 应用的编号策略选择提供了实用指导。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1843

delphi 监听打印机端口中数据_Zebra打印机USB 获取告警信息

回顾在以前我介绍过如何通过^SX指令设置通过网络端口获取打印机的告警信息《打印机告警信息获取》发送设置指令^XA^SX*,D,Y,Y,192.168.1.102,6666^XZPC端TCP 指定端口监听最新通过USB端口获取告警客户使用的桌面型打印机希望利用USB端口的双向通讯的特性,也能实时了解打印机的状态,或者打印作业是否完成等信息能否实现打印机的状态告警信息获取呢?可以,支持,没问...

weixin_39550940的博客 1044

利用autojs制作抢购支付宝消费劵的手机脚本

前期准备工作 1.打开支付宝,点击中间的抢消费券的广告 2.点击左上角,将抢购页面添加到首页 3.查看支付宝首页是否出现消费劵 . autojs代码 "auto"; functiontaskstart(){ sleep(1000); launchApp('支付宝'); toast("正在打开支付宝应用"); sleep(1000); varxf=textContains("消费").findOne().bounds(); ...

洛阳泰山的博客 1万+

两个相同放大镜叠加焦距计算

关于两个相同放大镜叠加后焦距的计算公式: F={  ( f  ( f - D ) ) / ( 2 f - D )  } + D, 其中,F为凸透镜叠加后的焦距,f为单个凸透镜焦距,D为透镜间距离。如果是多个相同凸透镜,且叠加时透镜间距为零,则有:F= f/n ,其中n为透镜片数。   还有一个计算放大镜倍数的公式:放大倍数=1+25/f ,f为放大镜焦距,单位厘米。 ...

听雨轩 5863

3D医学影像开发入门<一>:VS2019+DCMTK3.6.8编译及环境配置

3D医学影像开发入门:VS2019+DCMTK3.6.8编译及环境配置

欧特GO 1307

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

上一篇: Android: Attaching Sources to Libraries in Eclipse
下一篇: How to Set up PHP on IIS7.5 Windows Server 2008 r2 with FastCGI
benwdm
博客等级 码龄26年 87粉丝 467原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值