谁能解释这应该如何工作(在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;


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

我在Delphi文档中找不到关于如何使用Printer函数和TPrinter变量的说明。我很高兴使用Button1技术的派生方式进行打印-如果可以确认这是“防弹”的方法,但我想了解一下Button2方法为什么不起作用。我应该只是假定释放我实例化的任何TPrinter对象不是我的责任,还是有更清晰的解释?

最佳答案

运行此代码时:

  MyPrinter := Printer;
  MyPrinter.BeginDoc;
  MyPrinter.Canvas.TextOut(10,10,'Hello World');
  MyPrinter.EndDoc;
  MyPrinter.Free;


Printer在功能退出时被删除。因此,当应用终止时,它将尝试再次将其删除,并且会出现错误。更重要的是,如果您尝试第二次运行此代码,它也会提高。 MyPrinter只是指向TPrinter函数返回的全局Printer对象的指针。您不应删除尚未创建的内容。

Printer函数的文档:


返回TPrinter的全局实例,以管理与
打印机。

打印机第一次创建全局TPrinter对象的实例
它被称为。使用打印机功能通过TPrinter进行打印
目的。

注意:全局TPrinter对象在以下情况下会自动释放:
应用程序关闭。致电SetPrinter之后,
返回不会自动释放。是来电者的
负责释放返回值或使用以下值替换返回值的责任
再次调用SetPrinter并释放替代打印机
第二个SetPrinter调用返回。

07-27 20:04