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 の「配置」は行のすべてのデータを対象としており、行に何かを書き込む前にのみ機能する可能性があります。したがって、次のいずれかを実行できます。

  • 「キャリッジリターン」(CR:Char(13)またはChar($D))のみを試しChar($1B)+'a'+Char(...)てみてください。その後、別のものが機能します。
  • または、等幅フォントを使用している場合は、Delphi コードを使用してデータを固定長文字列にフォーマットします。おそらく、Format機能を使用します。

追加のヒント: 次のような構文+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 に答える