有人可以解释一下这应该如何工作(在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对象,或者是否有更明确的解释?
答案 0 :(得分:5)
运行此代码时:
MyPrinter := Printer;
MyPrinter.BeginDoc;
MyPrinter.Canvas.TextOut(10,10,'Hello World');
MyPrinter.EndDoc;
MyPrinter.Free;
在功能退出时删除 Printer
。因此,当应用程序终止时,它会再次尝试删除它,并且您会收到错误消息。不仅如此,如果您尝试第二次运行此代码,它也会提升。 MyPrinter
只是指向TPrinter
函数返回的全局Printer
对象的指针。你不应该删除你没有创建的东西。
Printer
功能的文档:
返回TPrinter的全局实例以管理与的交互 打印机。
Printer第一次创建全局TPrinter对象的实例 它被称为。使用打印机功能使用TPrinter进行打印 对象
注意:全局TPrinter对象在自动释放时自动释放 应用程序关闭。在调用SetPrinter后,打印机即可 返回不会自动释放。这是打电话的人 负责释放返回值,或使用替换它 另一个调用SetPrinter并释放替代打印机 第二个SetPrinter调用返回。