Delphi TPrinter和错误217

Pen*_*ino 1 printing delphi 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(Sender: TObject);
var
  MyPrinter : TPrinter;
begin
  MyPrinter := Printer;
  MyPrinter.BeginDoc;
  MyPrinter.Canvas.TextOut(10,10,'Hello World');
  MyPrinter.EndDoc;
  MyPrinter.Free;
end;
Run Code Online (Sandbox Code Playgroud)

如果我单击Button1,程序将在我的默认打印机上打印"Hello World",并在关闭它时正常关闭(使用关闭按钮).如果相反,我点击Button2,程序打印一个相同的页面,但现在当我关闭关闭按钮时,我收到错误217消息.

我无法在Delphi文档中找到有关如何使用Printer函数和TPrinter变量的说明.我很高兴使用Button1技术的派生来打印 - 如果确认这是'防弹'的方法,但想了解为什么Button2方法不起作用.我是否应该假设释放任何我实例化的TPrinter对象不是我的责任,还是有更明确的解释?

Ari*_*nhh 5

当您运行此代码时:

  MyPrinter := Printer;
  MyPrinter.BeginDoc;
  MyPrinter.Canvas.TextOut(10,10,'Hello World');
  MyPrinter.EndDoc;
  MyPrinter.Free;
Run Code Online (Sandbox Code Playgroud)

Printer在功能退出时删除.因此,当应用程序终止时,它会再次尝试删除它,并且您会收到错误消息.不仅如此,如果您尝试第二次运行此代码,它也会提升.MyPrinter只是一个指向全局TPrinter对象的指针,由Printer函数返回.你不应该删除你没有创建的东西.

Printer功能文档:

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

Printer在第一次调用时创建全局TPrinter对象的实例.使用打印机功能使用TPrinter对象进行打印.

注意:应用程序关闭时,将自动释放全局TPrinter对象.调用SetPrinter后,将不会自动释放返回的打印机.调用者有责任释放返回值,或者使用另一个调用SetPrinter来替换它,并释放第二个SetPrinter调用返回的替代打印机.

  • 确实是的.Printer函数返回一个全局`TPrinter`对象的实例,该对象是在第一次使用时创建的.只要您没有使用`SetPrinter`函数,它就会在应用程序退出时自动释放. (2认同)
  • @Penguino`Printer()`函数返回一个RTL拥有的`TPrinter`单例对象.根据需要使用`TPrinter`.而且您不仅限于默认打印机.您可以设置`TPrinter.PrinterIndex`属性以与其他打印机一起使用. (2认同)