Delphi-tpinter和错误217

Delphi-tpinter和错误217,delphi,printing,runtime-error,Delphi,Printing,Runtime Error,有谁能解释一下这应该如何工作(在Windows10上运行的Delphi XE2) 在极简主义应用程序(一个带有两个按钮的表单)中,使用以下代码: procedure TForm2.Button1Click(Sender: TObject); begin Printer.BeginDoc; Printer.Canvas.TextOut(10,10,'Hello World'); Printer.EndDoc; end; procedure TForm2.Button2Click(Se

有谁能解释一下这应该如何工作(在Windows10上运行的Delphi XE2)

在极简主义应用程序(一个带有两个按钮的表单)中,使用以下代码:

procedure TForm2.Button1Click(Sender: TObject);
begin
  Printer.BeginDoc;
  Printer.Canvas.TextOut(10,10,'Hello World');
  Printer.EndDoc;
end;

procedure TForm2.Button2Click(Sender: TObject);
var
  MyPrinter : TPrinter;
begin
  MyPrinter := Printer;
  MyPrinter.BeginDoc;
  MyPrinter.Canvas.TextOut(10,10,'Hello World');
  MyPrinter.EndDoc;
  MyPrinter.Free;
end;
如果单击按钮1,程序将在默认打印机上打印“Hello World”,并在关闭时正常关闭(使用关闭按钮)。相反,如果我单击按钮2,程序将打印相同的页面,但现在当我使用关闭按钮关闭时,会收到错误消息


我在Delphi文档中找不到关于如何正确使用打印机函数和tpinter变量的澄清。我很高兴使用Button1技术的衍生工具来打印——如果这是一种“防弹”方式,但我想了解Button2方法不起作用的原因。我是否应该假设释放我实例化的任何tpinter对象不是我的责任,或者是否有更清楚的解释?

当您运行此代码时:

  MyPrinter := Printer;
  MyPrinter.BeginDoc;
  MyPrinter.Canvas.TextOut(10,10,'Hello World');
  MyPrinter.EndDoc;
  MyPrinter.Free;
打印机
在功能退出时被删除。因此,当应用程序终止时,它会再次尝试删除它,您会得到一个错误。更重要的是,如果您再次尝试运行此代码,它也会引发错误
MyPrinter
只是一个指向全局
TPrinter
对象的指针,由
Printer
函数返回。你不应该删除你没有创建的东西

打印机
功能的文档:

返回tpinter的全局实例以管理与的交互 打印机

打印机第一次创建全局tpinter对象的实例 它被称为。使用打印机功能使用TPRIN打印 反对

注意:当 应用程序关闭。调用SetPrinter后,打印机 返回的值不会自动释放。这是打电话的人的电话 负责释放返回值,或使用 再次调用SetPrinter并释放 第二个SetPrinter调用返回


运行此代码时:

  MyPrinter := Printer;
  MyPrinter.BeginDoc;
  MyPrinter.Canvas.TextOut(10,10,'Hello World');
  MyPrinter.EndDoc;
  MyPrinter.Free;
打印机
在功能退出时被删除。因此,当应用程序终止时,它会再次尝试删除它,您会得到一个错误。更重要的是,如果您再次尝试运行此代码,它也会引发错误
MyPrinter
只是一个指向全局
TPrinter
对象的指针,由
Printer
函数返回。你不应该删除你没有创建的东西

打印机
功能的文档:

返回tpinter的全局实例以管理与的交互 打印机

打印机第一次创建全局tpinter对象的实例 它被称为。使用打印机功能使用TPrinter打印 反对

注意:当 应用程序关闭。调用SetPrinter后,打印机 返回的值不会自动释放。这是打电话的人的电话 负责释放返回值,或使用 再次调用SetPrinter并释放 第二个SetPrinter调用返回


因此,如果我理解正确,Printer函数只返回一个预先创建的tpinter对象,该对象被设置为与默认打印机匹配。可以说,它不应该被视为一个工厂。那么,如果我只是像使用TPrinter类型的全局变量(而不是Delphi帮助中描述的函数)一样使用打印机,那么我是否正确?是的。打印机函数返回第一次使用时创建的全局
tpinter
对象的实例。只要您没有使用
SetPrinter
函数,@Penguino
Printer()
函数返回RTL为您拥有的
TPrinter
单例对象,它就会在应用程序退出时自动释放。只需根据需要使用
TPrinter
。而且您也不仅仅局限于默认打印机。您可以将
tpinter.PrinterIndex
属性设置为与其他打印机一起使用。@Ari0nhh谢谢大家。现在一切都清楚了。你能指出你引用的文件在哪里吗?在(或F1指示我访问的旧XE2版本的帮助文件)下,没有“注意:”,只有注释“打印机在打印机单元中声明。若要使用打印机功能和TPrinter对象,请将打印机添加到单元的uses子句(Delphi)或在源文件(C++)中包含Printers.hpp。”。。。这不太有用。@Penguino我使用了
打印机
设置打印机
函数的帮助主题:因此,如果我理解正确,打印机函数只返回一个预先创建的TPrinter对象,该对象被设置为与默认打印机匹配。可以说,它不应该被视为一个工厂。那么,如果我只是像使用TPrinter类型的全局变量(而不是Delphi帮助中描述的函数)一样使用打印机,那么我是否正确?是的。打印机函数返回第一次使用时创建的全局
tpinter
对象的实例。只要您没有使用
SetPrinter
函数,@Penguino
Printer()
函数返回RTL为您拥有的
TPrinter
单例对象,它就会在应用程序退出时自动释放。只需根据需要使用
TPrinter
。而且您也不仅仅局限于默认打印机。您可以将
tpinter.PrinterIndex
属性设置为与其他打印机一起使用。@Ari0nhh谢谢大家。现在一切都清楚了。你能指出你在哪里找到你引用的文件吗?在(或F1指示我访问的旧XE2版本的帮助文件)下没有“备注:”,只有“打印机”注释在打印机单元中声明。若要使用打印机功能和TPrinter对象,请将打印机添加到单元的uses子句(Delphi)或includ