線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1253
推到 Plurk!
推到 Facebook!

关于继承TPrinter的问题

尚未結案
fangwy
中階會員


發表:99
回覆:139
積分:62
註冊:2003-09-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-12-21 11:27:01 IP:218.5.xxx.xxx 未訂閱
我的代码如下 //24针打印机X,Y轴上的每英吋象素数 PixelsProIn24X = 180; PixelsProIn24Y = 180; TNewPrinter = class(TPrinter) private public constructor Create; destructor Destroy; override; //为了处理9针打印机和24针打印机在打印上的差异而增加 procedure CanvasTextOut(X, Y: Integer; const Text: string); end; { TNewPrinter } procedure TNewPrinter.CanvasTextOut(X, Y: Integer; const Text: string); var diX, diY: integer; diPixelsProIn: integer; dsText: string; begin //根据每英吋象素数不同按比例转换 diPixelsProIn := GetDeviceCaps(Handle, LOGPIXELSX); if diPixelsProIn <> PixelsProIn24X then diX := Trunc(X * diPixelsProIn / PixelsProIn24X 0.5) else diX := X; diPixelsProIn := GetDeviceCaps(Handle, LOGPIXELSY); if diPixelsProIn <> PixelsProIn24Y then diY := Trunc(Y * diPixelsProIn / PixelsProIn24Y 0.5) else diY := Y; dsText := Text; Canvas.TextOut(diX, diY, dsText); end; constructor TNewPrinter.Create; begin inherited Create; end; destructor TNewPrinter.Destroy; begin inherited Destroy; end; 可是在下面这一句总是提示 EAccessViolation类错误.即访问内存有问题. Canvas.TextOut(diX, diY, dsText); 谢谢!
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-12-21 18:11:47 IP:220.130.xxx.xxx 未訂閱
你好像不能僅僅從TPrinter繼承下來去改寫你自己的TNewPrinter,建議你 參考一下TPrinter的Help以及Printers.pas,你會發現有些事項必須加以考 量. 例如: 引用一個TPrinter的Instance,必須透過function Printers.Printer;而且只函數回傳的物件是一個型態為TPrinter的物件變數,同時許多公用函數裡多直接 引用這個物件變數,所以你可能要自己寫一個回傳TNewPrinter的函數,並指定給 FPrinter,而在程式碼中有引用到TNewPrinter的特性,應將FPrinter轉型.
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-12-21 18:20:06 IP:220.130.xxx.xxx 未訂閱
Sorry!剛剛看了一下,FPrinter: TPrinter; 是宣告在 implementation的下面,所以你應該無法直接引用它. 如此一來就不知道該如何改寫了. 請其他人 幫幫忙吧!
fangwy
中階會員


發表:99
回覆:139
積分:62
註冊:2003-09-10

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-22 08:45:40 IP:218.5.xxx.xxx 未訂閱
谢谢jow: "引用一個TPrinter的Instance,必須透過function Printers.Printer"这一问题昨晚看了HELP,我也看到这一点,所以我将代码改了改: TNewPrinter = class(TObject) private FCanvas: TCanvas; CurPrinter: TPrinter; function GetCanvas: TCanvas; procedure SetCanvas(Value: TCanvas); public property Canvas: TCanvas read GetCanvas write SetCanvas; procedure BeginDoc; procedure EndDoc; procedure Refresh; constructor Create; destructor Destroy; override; procedure CanvasTextOut(X, Y: Integer; const Text: string); end; constructor TNewPrinter.Create; begin inherited Create; CurPrinter := Printer; end; destructor TNewPrinter.Destroy; begin inherited Destroy; if CurPrinter <> nil then CurPrinter := nil; end; 刚刚试了一下,没再出错了.
系統時間:2024-07-03 13:53:07
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!