ESC / POS不同的对齐在一行中

时间:2015-09-07 14:41:42

标签: delphi escpos

我使用Delphi,有人可以帮我为下一个打印输出行构建正确的ESC / POS命令:

subimage

因此,左侧部分应该左对齐,右侧部分右对齐。我试图用反向反馈来实现它:

"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

我可以通过ESC / POS命令实现它,或者我必须在某些格式函数上构建所需的字符串吗?

2 个答案:

答案 0 :(得分:1)

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

  • 尝试并看到“回车”(CR:Char(13)Char($D)),然后另一个Char($1B)+'a'+Char(...)将起作用,
  • 或者,假设您使用等宽字体,请使用Delphi代码将数据格式化为固定长度的字符串。 Perhaps with the Format function.

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

答案 1 :(得分: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;

正如你所看到我正在分析字体,字体样式和打印区域宽度,依赖于它我计算偏移量