2017-05-17 64 views
1

任何人都可以解釋這應該如何工作(在Windows10上運行的Delphi XE2)?德爾福TPrinter和錯誤217

簡約的應用程序 - 包含兩個按鈕的形式 - 用下面的代碼:

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文檔中找到有關如何使用打印機功能和TPrinter變量的說明。我很高興使用Button1技術的派生物進行打印 - 如果確認這是「防彈」方式,但想了解爲什麼Button2方法不起作用。我是否應該假設它不是我的負責釋放任何我實例化的TPrinter對象,還是有更清晰的解釋?

回答

5

當您運行此代碼:

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

Printer是在函數退出刪除。所以當應用程序終止時,它會嘗試再次刪除它,並且出現錯誤。更重要的是,如果你嘗試第二次運行這個代碼,它也會增加。 MyPrinter只是指向由Printer函數返回的全局對象TPrinter的指針。你不應該刪除你沒有創建的東西。

Printer功能的文檔:

返回TPrinter的全局實例來管理與 打印機的交互。

打印機第一次創建一個全局TPrinter對象的實例,它被調用時第一次調用 。使用打印機功能使用TPrinter 對象進行打印。

注意:當 應用程序關閉時,全局TPrinter對象會自動釋放。打電話給SetPrinter後, 返回的打印機不會自動釋放。致電者的責任是釋放返回值,或者使用 對SetPrinter的另一個呼叫替換它,並釋放 第二個SetPrinter調用返回的替代打印機。

+0

因此,如果我理解正確,Printer函數只是返回一個預先創建的TPrinter對象,該對象設置爲與默認打印機相匹配。可以這麼說,它不應該被認爲是一個TPrinter工廠。那麼我是否正確,如果我只是使用打印機,就好像它是一個TPrinter類型的全局變量(而不是Delphi幫助中描述的函數)? – Penguino

+2

是的。打印機函數返回全局「TPrinter」對象的實例,該實例在第一次使用時創建。只要你沒有使用'SetPrinter'函數,它就會在應用程序退出時自動釋放。 – Ari0nhh

+2

@Penguino'Printer()'函數返回一個RTL爲你擁有的'TPrinter'單例對象。根據需要使用'TPrinter'。而且,您也不僅限於默認的打印機。您可以將TPrinter.PrinterIndex屬性設置爲與其他打印機一起使用。 –