在delphi中打印到非默认打印机

问题描述 投票:5回答:1

我想使用Delphi将打印作业发送到打印机。理想情况下,我希望能够在不让用户从打印对话框中选择打印机的情况下执行此操作。

我希望能够使用Windows默认打印机以外的打印机。

我试过用打印机名称设置打印机:

Vcl.Printers.Printer.PrinterIndex := Vcl.Printers.Printer.Printers.IndexOf('My Printer Name');

但是,当我打印时,它将恢复使用默认打印机

delphi
1个回答
10
投票

传递给IndexOf的名字必须与Printer.Printers中的名字完全匹配才能奏效。如果它们不准确,包括CASE,IndexOf将返回-1,这意味着“使用默认打印机”。

对于特定示例,如果实际打印机名称为IndexOf('hp laserjet')HP LaserJet,则使用hp laserjet 5将返回-1。

如果您没有指定确切的名称,则可以通过迭代列表来进行部分匹配。典型系统不太可能有太多的打印机可用于提高效率;我们有几打,没关系。

以下是我们的情况:我们的办公室分为三个基本部门(财政,行政和客户服务)。每个都有一个不同的打印机,可以保存pin-feed(点阵)标签,但我们有在所有部门运行的应用程序。我们只需给出包含单词Labels - Fiscal LabelsAdmin Labels等的打印机名称,而不是让应用程序知道它正在运行哪个部门。我们可以找到带有循环的相应打印机:

function GetLabelPrinterIndex: Integer;
var
  i: Integer;
begin
  for i := 0 to Printer.Printers.Count - 1 do
    if AnsiContainsText(Printer.Printers[i], `Labels`) then
    begin
      Exit(i);
    end;
  Result := -1;
end;

作为注释:我将从您的引用中删除VCL前缀;这意味着您的代码将无法跨平台使用。如果您只是确保Printers在您的uses子句中,您可以只使用Printers.Printer,并且更改目标平台(VCL Win32 / 64,FMX 32/64,OSX)将根据构建配置为您调整uses子句。

© www.soinside.com 2019 - 2024. All rights reserved.