方法override的问题(100分)

  • 主题发起人 主题发起人 sw7309
  • 开始时间 开始时间
S

sw7309

Unregistered / Unconfirmed
GUEST, unregistred user!
TY = CLASS
PRIVATE
PUBLIC
CONSTRUCTOR Create
VIRTUAL
ABSTRACT;
FUNCTION bLoadFromFile(sFile: STRING): Boolean
VIRTUAL
ABSTRACT
//从文件导入,成功返回True,失败返回False
PROCEDURE Show(Canvas: TCanvas)
VIRTUAL
ABSTRACT
//在Canvas上显示
END;

TQhY = CLASS(TYk)
PRIVATE
PUBLIC
FUNCTION bLoadFromFile(sFile: STRING): boolean
OVERRIDE;
PROCEDURE Show(Canvas: TCanvas)
OVERRIDE
//在Canvas上显示
CONSTRUCTOR Create
OVERRIDE;
DESTRUCTOR Free;
END;

procedure KKK;
VAR Y : TY;
begin
Y := TQhY.Create;
IF Y.bLoadFromFile('c:/a.img') THEN
Y.Show(image1.Canvas);//*****出错***********
end;


请问,上述代码为什么会在有*号的一行出错?
 
我想不明白的是为什么Y.bLoadFromFile调用没有问题,而Y.Show就会出现
异常
 
为什么不把声明
VAR Y : TY;
换成
VAR Y : TQhY;

有办法跟踪Show的实现细节吗?是不是在Show内部出现的问题?
 
上面的代码中,类QThY的声明应为:
TQhY = CLASS(TY)
PRIVATE
PUBLIC
FUNCTION bLoadFromFile(sFile: STRING): boolean
OVERRIDE;
PROCEDURE Show(Canvas: TCanvas)
OVERRIDE
//在Canvas上显示
CONSTRUCTOR Create
OVERRIDE;
DESTRUCTOR Free;
END;

Show内部很简单,
Canvas.Rectangle(0, 0, 100, 100);
就这么一个语句.
至于不声明为var Y:TQhY的原因,是因为TY可能会有很多继承类,每一个类都不太相同,但都
要调用bLoadFromFile这个方法,我想这样做:
Y := TQhY.Create;
Y.bloadfromfile()
Y.free;
Y:=TAY.Create;//假定TAY也是TY的继承类
Y.bloadfromfile()
Y.free;

目的是判断到底一个文件是哪一个类的实例保存的
 
我想是TQhY.show实现的问题。
你的这个用法本身是没有问题的。
 
报错信息?
把Canvas.Rectangle(0, 0, 100, 100);暂时屏蔽掉再看看。
 
上面看不出任何问题,
你在一Form的canvas上Show试试!
y.show(canvas);
image1在含有picture的情况下的canvas是禁止画的,
你没有给出代码,实在难以判断

 
更override有什么关系?
是不是其他问题?
 
应该不是override的问题,是在show的实现上有问题吧,把代码贴全一点看看。你的代码看不出Image1到哪去关联a.bmp。
 

在TY类中,根本就没有对FUNCTION bLoadFromFile(sFile: STRING): Boolean
进行实现
当然错了
 
procedure KKK;
VAR Y : TY;
begin
Y := TQhY.Create;
IF Y.bLoadFromFile('c:/a.img') THEN
// Y.Show(image1.Canvas);//*****出错***********
image1.Canvas.Rectangle(0, 0, 100, 100);
end;
这样你再试试看
 
Dr.johns,let_it_be,majorsoft,xuxiaohan的思路都是对的,上面的代码没有问题,
是我在实现bLoadFromFile时出错引起的
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
744
import
I
后退
顶部