1

我正在尝试将命令直接发送到 Zebra TLP2844 打印机。我遵循了这里提出的建议,我的最终代码如下:

var
  cm: String;
  p: TPrinter;
  i: integer;
begin
  p := Printer;
  p.BeginDoc;    
  for i := 0 to memo1.Lines.Count-2 do
  begin
    cm := memo1.Lines[i];
    if Escape(p.Canvas.Handle,
                PASSTHROUGH,
                Length(cm),
                PAnsiChar(cm),
                nil) = 0 then
      ShowMessage('Command error: ' + IntToStr(GetLastError));
  end;
  p.EndDoc;
end;

memo1 的内容是(第一行为空),如下所示

N
q609
Q203,26
B26,26,0,UA0,2,2,152,B,"603679025109"
A253,26,0,3,1,1,N,"SKU 6205518 MFG 6354"
A253,56,0,3,1,1,N,"2XIST TROPICAL BEACH"
A253,86,0,3,1,1,N,"STRIPE SQUARE CUT TRUNK"
A253,116,0,3,1,1,N,"BRICK"
A253,146,0,3,1,1,N,"X-LARGE"
P1,1

打印机似乎没有正确接收或解释这些命令。我检查了打印机是否处于页面模式(EPL2),使用建议的代码我可以打开打印机句柄。但是什么都没有打印,只送入了一行新的标签。

我试图将命令完全更改为明显错误的命令,并且行为是相同的。

我还应该寻找什么来打印东西?

4

2 回答 2

1

大多数采用原始命令的打印机都需要一个前缀(字符的起始序列)和后缀(字符的结束序列)来包装每个命令。我不知道 Zebra 的前缀和后缀是什么,但文档应该会告诉你。

只需添加一对常量来定义前缀和后缀,并在发送之前将它们添加到您的命令中。

另一个问题可能是您正在从 a 读取命令的内容TMemo,在 Delphi 2009 及更高版本中,它包含 Unicode 字符串。然后,您将它们转换为PAnsiChar,这可能会截断内容。cm通过定义为提前进行转换AnsiString,然后在类型转换传递给Escape函数之前先分配给它(就像你一样)。我在我的代码中做了这个来说明它。

var
  cm: AnsiString;
  p: TPrinter;
  i: integer;
const
  ZPrefix = AnsiString('$(');     // Replace values for each of these with what
  ZSuffix = AnsiString(')$');     // your documentation says you should use
begin
  p := Printer;
  p.BeginDoc;    
  for i := 0 to memo1.Lines.Count-2 do
  begin
    cm := ZPrefix + memo1.Lines[i] + ZSuffix;
    if Escape(p.Canvas.Handle,
                PASSTHROUGH,
                Length(cm),
                PAnsiChar(cm),
                nil) = 0 then
      ShowMessage('Command error: ' + IntToStr(GetLastError));
  end;
  p.EndDoc;
end;
于 2013-06-06T18:47:29.950 回答
0

我用 php 编程,就像 C

我可以把东西送到打印机就好了

我的代码看起来像你的代码唯一的事情是我不确定你的编程语言如何处理 php 中的换行符它在每行的末尾是 \n

如果换行符不存在,则打印作业将不会打印

如果 " 未发送,则不会打印

您的 EPL 看起来不错,应该可以打印

zebra 网站上有某处下载,您可以在其中向打印机发送命令,该打印机通过 USB 电缆连接到您的计算机

认为它被称为 Zebra Setup Utilities

于 2014-03-24T19:55:23.563 回答