谁能解释这应该如何工作(在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调用返回。