2

我正在使用 Delphi,有人可以帮我构建正确的 ESC/POS 命令以打印输出行,如下所示:

"Article_Name        100.00$"

所以线的左边部分应该有左对齐,右部分 - 右对齐。我正在尝试通过反向馈送来实现它:

'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 命令实现它,还是必须通过某些格式函数构建所需的字符串?

4

2 回答 2

1

如果我没记错的话,ESC/POS 'alignment' 适用于行中的所有数据,并且可能仅在您向行中写入任何内容之前才起作用。所以你可以:

  • 尝试仅查看“回车”(CR:Char(13)Char($D)),然后使用不同的方法Char($1B)+'a'+Char(...)
  • 或者,假设您使用等宽字体,请使用 Delphi 代码将数据格式化为固定长度的字符串。也许与格式功能。

额外提示:+Char()+您可以使用语法编写#,例如:'BBBBB'#$1B'K'#30

于 2015-09-07T15:05:17.757 回答
0

我没有找到通过 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;

如您所见,我正在分析字体、字体样式和打印区域宽度,取决于它我计算偏移量

于 2015-09-09T08:13:31.097 回答