【问题标题】:How to use DeviceCapabilities to Retrieve the paper names and sizes from specific printer in Delphi如何使用 DeviceCapabilities 从 Delphi 中的特定打印机中检索纸张名称和尺寸
【发布时间】:2019-08-27 20:18:59
【问题描述】:

如果可能的话,我一直在寻找一种方法来检索特定打印机支持的纸张及其尺寸(宽度和高度)(以毫米为单位)。

我已经看到并“研究”了许多关于使用 Printer.GetprinterPrinter.SetPrinter 的帖子和网站,但我对完成这项工作的整个过程真的很了解,我了解到我必须使用 DeviceCapabilities 才能检索特定于一台打印机的数据,但我真的不知道如何使用这些结构。我需要类似于this 的东西,但对于特定的打印机并使用DeviceCapabilities。 我使用 Delphi VCL。

在链接的问题中,他们使用EnumForms,据我所知,它适用于所有打印机,他们还提到DeviceCapabilities 用于特定打印机,这就是我需要的,以获得支持的纸张名称和尺寸但仅适用于选定的打印机,而不是全部。 假设我选择了我的打印机:Printer.PrinterIndex:= Printer.Printers.IndexOf(MyPrinter); 我想获得该打印机支持的纸张和纸张尺寸。

非常感谢您提供的任何帮助!

【问题讨论】:

  • 您想为任意打印机编写代码,还是只为这款 Brother 型号编写代码?
  • @DavidHeffernan 打印机可能会因用户而异,但兄弟型号是我目前正在运行的测试。
  • 是的@whosrdaddy,这实际上是我在我的问题中链接的帖子。问题是 Sertac 说如果你想要来自特定打印机的数据,你应该使用 DeviceCapabilities 而不是 EnumForms
  • 您应该删除对特定打印机的引用,以避免有人认为您需要专门针对该型号的代码
  • 嗨,Hiram,我明白了。请试用 here 中的 Peter Lowers 的代码,更具体的是 GetPaperInfo 过程。

标签: delphi winapi printing vcl


【解决方案1】:

这是一个示例,它为当前选定的打印机调用DeviceCapabilities,并将“指定打印机驱动程序的当前默认初始化值”支持的纸张名称输出到备忘录。上一句中引用的部分来自函数的documentation,我并不绝对肯定我理解它的含义。发生这种情况是因为 DevMode 未通过。

procedure TForm1.Button1Click(Sender: TObject);
var
  PrinterName: string;
  HPrinter: THandle;
  Ret: DWORD;
  Buf: array of array [0..63] of Char;
  i: Integer;
begin
  PrinterName := Printer.Printers[Printer.PrinterIndex];
  if OpenPrinter(PChar(PrinterName), HPrinter, nil) then begin
    Ret := DeviceCapabilities(PChar(PrinterName), nil, DC_PAPERNAMES, nil, nil);
    if Ret > 0 then begin
      SetLength(Buf, Ret);
      DeviceCapabilities(PChar(PrinterName), nil, DC_PAPERNAMES, Pointer(Buf), nil);
      for i := 0 to Ret - 1 do
        Memo1.Lines.Add(Buf[i]);
    end;
    ClosePrinter(HPrinter);
  end;
end;

解释代码有点毫无意义,我会复制文档。我包含了上面的链接。

【讨论】:

  • 我尝试了代码,但备忘录用数字而不是名称填充,它们是这样的:| 1 | 1 | 2 | 2 | 2 | 3 | 3 | 5 | 5 | 6 | 6 | 6 | 1 | 2 | 5 | 1 | 2 | 3 | 5 | 5 | 6 | 1 | 2 | 3 | 5 | 5 | 6 | 1 |我刚刚将PrinterName 更改为我的打印机,它确实存在。
  • @Hiram PAnsiChar 演员应该是 PChar,在 memo.lines.add 中。不过好像还是有问题,我去看看。
  • 非常感谢您抽出宝贵的时间。是的,如果我在单击按钮后关闭程序,我也会遇到访问冲突。
  • @Hiram - 我修改了字符串提取代码,请更新后重试。
  • 效果很好!是否可以以类似的方式使用此代码来获取纸张的宽度和高度(以毫米为单位)?
猜你喜欢
  • 2013-12-30
  • 1970-01-01
  • 1970-01-01
  • 2022-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多