Delphi TPrinter和错误217

时间:2017-05-17 03:47:40

标签: 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(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对象,或者是否有更明确的解释?

1 个答案:

答案 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调用返回。