4

この質問に基づいて、Zebra TLP2844 に直接コマンドを送信する次のコードを実装しました。

var
  cmm: AnsiString;
  i: integer;
begin
  commands.saveToFile('path\to\a\file');
  Printer.BeginDoc;
  cmm := '';
  for i := 0 to commands.Count-1 do
    cmm := cmm + commands[i] + #10;
  Escape(Printer.Canvas.Handle, PASSTHROUGH, Length(cmm), PAnsiChar(cmm), nil);
  Printer.EndDoc;
end;

コマンドは、プリンターに送信するすべてのコマンドを含む TSringList です。すべてのコマンドをテキスト ファイルに保存することに注意してください。

さて、このテキスト ファイルを印刷用に送信すると、ドライバの設定から、ツール -> アクション -> ファイルの送信を使用して、完全に印刷されます。

上記のコードを使用すると、印刷後に余分な行のラベルが吐き出されます。

明らかに、ここで何か間違ったことをしていることがわかりますが、何が原因なのかわかりません。

私が試したこと

  • コードのようにコマンドを連結せずに、コマンドを 1 つずつ送信します。結果:何も印刷されません。
  • #10を#13#10に交換。結果:同じクレイジーな動作 (実際、Zebra EPL のドキュメントによると、見つかった #13 はすべて無視されます)

Zebra のツールとまったく同じ方法でコマンドをプリンタに送信するには、他に何を試せばよいでしょうか?

4

3 に答える 3

2

ExtEscape()私の知る限り、 APIレイアウトで期待されるようにバッファをフォーマットする必要があります。を使用Escape()したことはありませんがExtEscape()、Zebra プリンターで動作しました。

MSDN doc の状態は次のとおりです。

lpszInData [in] 指定されたエスケープに必要な入力構造体へのポインター。バッファの最初のワードには、入力データのバイト数が含まれます。バッファの残りのバイトには、データ自体が含まれます。

したがって、これを次のようにコーディングできます。

  cmm := '00'; // reserve space for the initial `word`
  for i := 0 to commands.Count-1 do
    cmm := cmm + commands[i] + #10;
  pword(cmm)^ := length(cmm)-2; // store the length
  if ExtEscape(Printer.Canvas.Handle, PASSTHROUGH, Length(cmm), pointer(cmm), 0, nil)<0 then
    raise Exception.Create('Error at printing to printer');
  Printer.EndDoc;

コマンドが適切にフォーマットされていない場合 (たとえば、文字が欠落している場合)、プリンター スプーラーでメモリ不足エラーが発生する可能性があることに注意してください - はい、私はそれを見ました! この場合、Printer Spooler サービスを強制終了してから再起動する必要があるかもしれません... コードを修正して、もう一度やり直してください...

また、Zebra のドキュメントで要求されているように、ESC各 の先頭に文字を配置することを忘れないでください。commands[]

于 2013-09-04T07:20:19.033 に答える
1

この手順を使用できます。ここで、LabelFile はラベル ファイルのフル パスです。このコードを使用しており、汎用テキスト ドライバー プリンターで動作し、プリンターがデフォルト プリンターとして設定されています。ゼブラ プリンタと Windows XP オペレーティング システムで動作します。 https://stackoverflow.com/a/27647044/2977139 これがお役に立てば幸いです。

于 2014-12-25T13:42:54.617 に答える