我想使用Delphi将打印作业发送到打印机。理想情况下,我希望能够在不让用户从打印对话框中选择打印机的情况下执行此操作。
我希望能够使用Windows默认打印机以外的打印机。
我尝试按打印机名称设置打印机:
Vcl.Printers.Printer.PrinterIndex := Vcl.Printers.Printer.Printers.IndexOf('My Printer Name');
但是,当我打印时,它将恢复使用默认打印机
答案 0 :(得分:9)
传递给IndexOf
的名称必须与完全匹配Printer.Printers
中的内容才能正常工作。如果它们不是完全,包括CASE,IndexOf
将返回-1
,这意味着“使用默认打印机”。
对于特定示例,如果实际打印机名称为IndexOf('hp laserjet')
或HP LaserJet
,则使用hp laserjet 5
将返回-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
在您的uses子句中,则可以只使用Printers.Printer
,并且更改目标平台(VCL Win32 / 64,FMX 32/64,OSX)将调整uses子句基于构建配置为您服务。