Delphi 直接向Zebra EPL发送命令

Delphi 直接向Zebra EPL发送命令,delphi,zebra-printers,epl,Delphi,Zebra Printers,Epl,我正在尝试将命令直接发送到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,

我正在尝试将命令直接发送到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;
备忘录1的内容如下(第一行为空):

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

我试图将命令完全更改为明显错误的命令,行为也是一样的


要打印内容还需要什么?

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

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

另一个问题可能是您正在从
TMemo
读取命令的内容,在Delphi 2009及更高版本中,TMemo包含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;

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

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

另一个问题可能是您正在从
TMemo
读取命令的内容,在Delphi 2009及更高版本中,TMemo包含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;

我用类似于C的php编程

我可以把东西送到打印机上

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

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

如果“未发送”,则不会打印

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

zebra网站上的某个地方有一个下载,您可以在那里向通过USB电缆连接到计算机的打印机发送命令


我认为它在php中被称为Zebra设置实用程序,类似于C

我可以把东西送到打印机上

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

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

如果“未发送”,则不会打印

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

zebra网站上的某个地方有一个下载,您可以在那里向通过USB电缆连接到计算机的打印机发送命令

我认为这就是Zebra设置实用程序