我想使用Delphi将打印作业发送到打印机.理想情况下,我希望能够在不让用户从打印对话框中选择打印机的情况下执行此操作.
我希望能够使用Windows默认打印机以外的打印机.
我试过用打印机名称设置打印机:
Vcl.Printers.Printer.PrinterIndex := Vcl.Printers.Printer.Printers.IndexOf('My Printer Name');
但是,当我打印时,它将恢复使用默认打印机
传递给该名称IndexOf
必须匹配究竟有什么在Printer.Printers
为了工作.如果它们不准确,包括CASE,IndexOf
将返回-1
,这意味着"使用默认打印机".
对于特定示例,IndexOf('hp laserjet')
如果实际打印机名称为HP LaserJet
或,则使用将返回-1 hp laserjet 5
.
如果您没有指定确切的名称,则可以通过迭代列表来进行部分匹配.典型系统不太可能有太多的打印机可用于提高效率; 我们有几打,没关系.
以下是我们的情况:我们的办公室分为三个基本部门(财政,行政和客户服务).每个都有一个不同的打印机,可以保存pin-feed(点阵)标签,但我们有应用程序在所有部门运行.相反,具有应用程序知道它正在运行哪个部门在选择标签打印机,我们只是给包含单词打印机的名称Labels
- Fiscal Labels
,Admin 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子句中,您可以使用just Printers.Printer
,并且更改目标平台(VCL Win32/64,FMX 32/64,OSX)将根据构建配置为您调整uses子句.