我想使用Delphi将打印作业发送到打印机。理想情况下,我希望能够在没有用户从打印对话框中选择打印机的情况下执行此操作。在delphi中打印到非默认打印机
我希望能够使用Windows默认打印机以外的打印机。
我已经尝试设置打印机名称打印机:
Vcl.Printers.Printer.PrinterIndex := Vcl.Printers.Printer.Printers.IndexOf('My Printer Name');
但是当我打印时,将恢复使用默认打印机
我想使用Delphi将打印作业发送到打印机。理想情况下,我希望能够在没有用户从打印对话框中选择打印机的情况下执行此操作。在delphi中打印到非默认打印机
我希望能够使用Windows默认打印机以外的打印机。
我已经尝试设置打印机名称打印机:
Vcl.Printers.Printer.PrinterIndex := Vcl.Printers.Printer.Printers.IndexOf('My Printer Name');
但是当我打印时,将恢复使用默认打印机
名称传递给IndexOf
必须究竟什么比赛在Printer.Printers
为了工作。如果他们不是确切,包括CASE,IndexOf
将返回-1
,这意味着“使用默认打印机”。
对于特定示例,如果实际打印机名称为HP LaserJet
或hp laserjet 5
,则使用IndexOf('hp laserjet')
将返回-1。
如果您没有指定确切的名称,可以通过迭代列表进行部分匹配。典型的系统不太可能有太多的打印机可用,因此效率很高;我们有几十个,没关系。
以下是我们的情况:我们的办公室分为三个基本部门(财务部门,管理部门和客户服务部门)。每台打印机都有一个支持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
位于您的使用条款中,则您只能使用Printers.Printer
,并且更改目标平台(VCL Win32/64,FMX 32/64,OSX)将根据构建配置为您调整使用条款。