Delphi-tpinter和错误217
有谁能解释一下这应该如何工作(在Windows10上运行的Delphi XE2) 在极简主义应用程序(一个带有两个按钮的表单)中,使用以下代码:Delphi-tpinter和错误217,delphi,printing,runtime-error,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(Se
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;
如果单击按钮1,程序将在默认打印机上打印“Hello World”,并在关闭时正常关闭(使用关闭按钮)。相反,如果我单击按钮2,程序将打印相同的页面,但现在当我使用关闭按钮关闭时,会收到错误消息
我在Delphi文档中找不到关于如何正确使用打印机函数和tpinter变量的澄清。我很高兴使用Button1技术的衍生工具来打印——如果这是一种“防弹”方式,但我想了解Button2方法不起作用的原因。我是否应该假设释放我实例化的任何tpinter对象不是我的责任,或者是否有更清楚的解释?当您运行此代码时:
MyPrinter := Printer;
MyPrinter.BeginDoc;
MyPrinter.Canvas.TextOut(10,10,'Hello World');
MyPrinter.EndDoc;
MyPrinter.Free;
打印机
在功能退出时被删除。因此,当应用程序终止时,它会再次尝试删除它,您会得到一个错误。更重要的是,如果您再次尝试运行此代码,它也会引发错误MyPrinter
只是一个指向全局TPrinter
对象的指针,由Printer
函数返回。你不应该删除你没有创建的东西
打印机
功能的文档:
返回tpinter的全局实例以管理与的交互
打印机
打印机第一次创建全局tpinter对象的实例
它被称为。使用打印机功能使用TPRIN打印
反对
注意:当
应用程序关闭。调用SetPrinter后,打印机
返回的值不会自动释放。这是打电话的人的电话
负责释放返回值,或使用
再次调用SetPrinter并释放
第二个SetPrinter调用返回
运行此代码时:
MyPrinter := Printer;
MyPrinter.BeginDoc;
MyPrinter.Canvas.TextOut(10,10,'Hello World');
MyPrinter.EndDoc;
MyPrinter.Free;
打印机
在功能退出时被删除。因此,当应用程序终止时,它会再次尝试删除它,您会得到一个错误。更重要的是,如果您再次尝试运行此代码,它也会引发错误MyPrinter
只是一个指向全局TPrinter
对象的指针,由Printer
函数返回。你不应该删除你没有创建的东西
打印机
功能的文档:
返回tpinter的全局实例以管理与的交互
打印机
打印机第一次创建全局tpinter对象的实例
它被称为。使用打印机功能使用TPrinter打印
反对
注意:当
应用程序关闭。调用SetPrinter后,打印机
返回的值不会自动释放。这是打电话的人的电话
负责释放返回值,或使用
再次调用SetPrinter并释放
第二个SetPrinter调用返回
因此,如果我理解正确,Printer函数只返回一个预先创建的tpinter对象,该对象被设置为与默认打印机匹配。可以说,它不应该被视为一个工厂。那么,如果我只是像使用TPrinter类型的全局变量(而不是Delphi帮助中描述的函数)一样使用打印机,那么我是否正确?是的。打印机函数返回第一次使用时创建的全局
tpinter
对象的实例。只要您没有使用SetPrinter
函数,@PenguinoPrinter()
函数返回RTL为您拥有的TPrinter
单例对象,它就会在应用程序退出时自动释放。只需根据需要使用TPrinter
。而且您也不仅仅局限于默认打印机。您可以将tpinter.PrinterIndex
属性设置为与其他打印机一起使用。@Ari0nhh谢谢大家。现在一切都清楚了。你能指出你引用的文件在哪里吗?在(或F1指示我访问的旧XE2版本的帮助文件)下,没有“注意:”,只有注释“打印机在打印机单元中声明。若要使用打印机功能和TPrinter对象,请将打印机添加到单元的uses子句(Delphi)或在源文件(C++)中包含Printers.hpp。”。。。这不太有用。@Penguino我使用了打印机
和设置打印机
函数的帮助主题:因此,如果我理解正确,打印机函数只返回一个预先创建的TPrinter对象,该对象被设置为与默认打印机匹配。可以说,它不应该被视为一个工厂。那么,如果我只是像使用TPrinter类型的全局变量(而不是Delphi帮助中描述的函数)一样使用打印机,那么我是否正确?是的。打印机函数返回第一次使用时创建的全局tpinter
对象的实例。只要您没有使用SetPrinter
函数,@PenguinoPrinter()
函数返回RTL为您拥有的TPrinter
单例对象,它就会在应用程序退出时自动释放。只需根据需要使用TPrinter
。而且您也不仅仅局限于默认打印机。您可以将tpinter.PrinterIndex
属性设置为与其他打印机一起使用。@Ari0nhh谢谢大家。现在一切都清楚了。你能指出你在哪里找到你引用的文件吗?在(或F1指示我访问的旧XE2版本的帮助文件)下没有“备注:”,只有“打印机”注释在打印机单元中声明。若要使用打印机功能和TPrinter对象,请将打印机添加到单元的uses子句(Delphi)或includ