Delphi 使用 Zebra 打印机打印备忘录

Delphi print memo to zebra printer

我需要帮助。 我有这段代码要通过 zebra 打印,但它什么也没打印。

  procedure TForm1.Button3Click(Sender: TObject);
    var
    cm: AnsiString;
    zpl : TStringList;
    p: TPrinter;
    i: integer;
    begin
    p := Printer;
    zpl := TStringList.Create;
    memo2.Lines.Add('^XA');
    memo2.Lines.Add('^LH5,5');
    memo2.Lines.Add(concat ('^FO50,20^ADN,36,20^FD', edit1.text,'^FS'));
    memo2.Lines.Add(concat ('^FO35,60^ADN,15,10^FD', edit4.text,'^FS'));
    memo2.Lines.Add(concat ('^FO50,115^BCN,60,N,N,N^FD', edit1.text, '^FS'));
    memo2.Lines.Add('^XZ');
    zpl.AddStrings (memo2.lines);
    p.BeginDoc;
    for i := 0 to memo2.Lines.Count-1 do
    begin
    zpl.Assign(memo2.lines);
    end;
    p.EndDoc
    end;

谢谢你帮助我 我知道将这些行打印为文本,但我需要将这些行作为命令发送到 Zebra 打印机。

有几个选项。您可以在 RAW 模式下打开打印机并使用 WritePrinter() 编写这些命令。有一个无效示例 here 及以下:

uses
  Printers, WinSpool;

procedure Print;
var 
  ADevice, ADeviceName, ADevicePort: array[0..255]of Char;
  PrinterHandle: THandle
  DocInfo: TDocInfo1;
  dwJob: cardinal;
  dwBytesWritten: cardinal;
  AUtf8: UTF8string;
  ADeviceMode: THandle;
begin
  //your printer (a windows generic printer works fine)
  Printer.PrinterIndex := LocalPrinterIndex; 
  Printer.GetPrinter(ADevice, ADeviceName, ADevicePort, ADeviceMode);

  //Need a handle to the printer
  if not OpenPrinter(ADevice, FPrinterHandle, nil) then 
    Exit;

  //Fill in the structure with info about this "document"
  DocInfo.pDocName := PChar('Spooler Document Name');
  DocInfo.pOutputFile := nil;
  DocInfo.pDatatype := 'RAW';

  //Inform the spooler the document is beginning
  dwJob := StartDocPrinter(PrinterHandle, 1, @DocInfo);
  if dwJob = 0 then 
  begin
    ClosePrinter(PrinterHandle);
    FPrinterHandle := 0;
    Exit;
  end;

  //Start a page
  if not StartPagePrinter(PrinterHandle) then 
  begin
    EndDocPrinter(PrinterHandle);
    ClosePrinter(PrinterHandle);
    FPrinterHandle := 0;
    Exit;
  end;

  //your zebra code... 
  AUtf8 := UTF8string('Hello world');
  WritePrinter(PrinterHandle, @AUtf8[1], Length(AUtf8), dwBytesWritten);

  //End the page
  if not EndPagePrinter(PrinterHandle) then 
  begin
    EndDocPrinter(PrinterHandle);
    ClosePrinter(PrinterHandle);
    FPrinterHandle := 0;
    Exit;
  end;

  //Inform the spooler that the document is ending
  if not EndDocPrinter(PrinterHandle) then 
  begin
    ClosePrinter(PrinterHandle);
    FPrinterHandle := 0;
    Exit;
  end;

  //Tidy up the printer handle
  ClosePrinter(PrinterHandle);
  FPrinterHandle := 0;
end;

或者您可以为该打印机安装仅通用文本驱动程序并使用老式的 Pascal WriteLn 调用进行打印,如 here 所述。您将需要创建自己的 SelectPrinter() 方法。包括如下:

procedure PrintLabel(LabelCommands: TStringList);
var
  F: TextFile;
  I: Integer;
begin
  SelectPrinter('LABEL PRINTER');

  AssignPrn(F);
  ReWrite(F);

  for I := 0 to LabelCommands.Count - 1 do
    WriteLn(F,LabelCommands[I]);

  CloseFile(F);
end;