我正在使用Delphi,有人可以帮助我建立正确的ESC/POS命令,以便打印输出行如下:
"Article_Name 100.00$"
所以line的左边部分应该是左对齐,右边部分应该是右对齐。我试图实现它与反向馈送:
'AAAAA' + Char($A);
'BBBBB' + Char($1B) + "K" + Char(30);
Char($1B)+'a'+Char(2) - set right alignment
'CCCCC' + Char($A);
Char($1B)+'a'+Char(1) - set back left alignment
所以反向馈送是有效的,但对齐不(所以在结果打印输出我有:
AAAAA
BBBBBCCCCC
我可以在ESC/POS命令上实现它吗?或者我必须在一些格式函数上构建所需的字符串?
如果我记得正确的话,ESC/POS 'alignment'适用于行上的所有数据,并且可能仅在您向行写入任何内容之前才起作用。所以你可以:
-
尝试,看看是否只有'回车' (CR:
Char(13)
或Char($D)
),然后不同的Char($1B)+'a'+Char(...)
将工作, - 或者,假设您使用等宽字体,使用Delphi代码将数据格式化为固定长度的字符串。可能与格式功能。
额外提示:您可以使用#
语法编写+Char()+
,例如:'BBBBB'#$1B'K'#30
我没有找到通过ESC/POS命令实现它的任何方法。这是我实现的格式函数:
procedure TNativePrint.DoAddLineWithTwoAlignments(const ALeftStr : string;
ALeftStrFont : TFontType;
ALeftStrFontStyle : TFontStyle;
const ARightStr : string;
ARightStrFont : TFontType;
ARightStrFontStyle : TFontStyle;
APrintAreaWidth : integer = 500);
const
vFomatLine = '';
var
vOffset : integer;
vCharSize : integer;
vLeftSize : integer;
vRightSize : integer;
begin
vCharSize := 12;
if (ALeftStrFont = ftFontA) then begin
vCharSize := 12;
end else if (ALeftStrFont = ftFontB) then begin
vCharSize := 9;
end;
if (ALeftStrFontStyle in [fsDoubleWidth, fsDoubleHW, fsBoldDoubleWidth, fsBoldDoubleHW]) then begin
vCharSize := vCharSize * 2;
end;
vLeftSize := length(ALeftStr) * vCharSize;
if (ARightStrFont = ftFontA) then begin
vCharSize := 12;
end else if (ARightStrFont = ftFontB) then begin
vCharSize := 9;
end;
if (ARightStrFontStyle in [fsDoubleWidth, fsDoubleHW, fsBoldDoubleWidth, fsBoldDoubleHW]) then begin
vCharSize := vCharSize * 2;
end;
vRightSize := length(ARightStr) * vCharSize;
vOffset := APrintAreaWidth - ( vLeftSize + vRightSize);
DoSetFont(ALeftStrFont, ALeftStrFontStyle);
DoAddLine(ALeftStr, false);
DoSetFont(ARightStrFont, ARightStrFontStyle);
DoAddLine(#$1B''+AnsiChar(vOffset)+#0, false);
DoAddLine(ARightStr);
end;
正如你所看到的,我正在分析字体,字体样式和打印区域宽度,根据它我计算偏移