关于继承TPrinter的问题 |
尚未結案
|
fangwy
中階會員 發表:99 回覆:139 積分:62 註冊:2003-09-10 發送簡訊給我 |
我的代码如下
//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 發送簡訊給我 |
你好像不能僅僅從TPrinter繼承下來去改寫你自己的TNewPrinter,建議你
參考一下TPrinter的Help以及Printers.pas,你會發現有些事項必須加以考
量. 例如:
引用一個TPrinter的Instance,必須透過function Printers.Printer;而且只函數回傳的物件是一個型態為TPrinter的物件變數,同時許多公用函數裡多直接
引用這個物件變數,所以你可能要自己寫一個回傳TNewPrinter的函數,並指定給
FPrinter,而在程式碼中有引用到TNewPrinter的特性,應將FPrinter轉型.
|
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
|
fangwy
中階會員 發表:99 回覆:139 積分:62 註冊:2003-09-10 發送簡訊給我 |
谢谢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;
刚刚试了一下,没再出错了.
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |