最近在用IMAGE时,发现有一个地方不太明白,还请大虾们点拨两下:
image1.picture---> TPicture;
在其导入图片时,无论bitmap,jpeg or icon都成功。
procedure TPicture.LoadFromFile(const Filename: string);
var
Ext: string;
NewGraphic: TGraphic;
GraphicClass: TGraphicClass;
begin
Ext := ExtractFileExt(Filename);
Delete(Ext, 1, 1);
GraphicClass := FileFormats.FindExt(Ext);
if GraphicClass = nil then
raise EInvalidGraphic.CreateFmt(SUnknownExtension, [Ext]); NewGraphic := GraphicClass.Create;
try
NewGraphic.OnProgress := Progress;
NewGraphic.LoadFromFile(Filename);
except
NewGraphic.Free;
raise;
end;
FGraphic.Free;
FGraphic := NewGraphic;
FGraphic.OnChange := Changed;
Changed(Self);
end;TGraphicClass= class of TGraphic; --->不明白
---------------------------------------------------------------
在此中:FGraphic := NewGraphic;
即TPicure.Graphic可以使用loadfromfile,不管是什么类型的,应该不出错。
但却出错了。
1、可能是我理解错了,希望能给偶说明一下。(或这里的NewGraphic.LoadFromFile(Filename);为什么会成功?)
2、解释一下Class of。
image1.picture---> TPicture;
在其导入图片时,无论bitmap,jpeg or icon都成功。
procedure TPicture.LoadFromFile(const Filename: string);
var
Ext: string;
NewGraphic: TGraphic;
GraphicClass: TGraphicClass;
begin
Ext := ExtractFileExt(Filename);
Delete(Ext, 1, 1);
GraphicClass := FileFormats.FindExt(Ext);
if GraphicClass = nil then
raise EInvalidGraphic.CreateFmt(SUnknownExtension, [Ext]); NewGraphic := GraphicClass.Create;
try
NewGraphic.OnProgress := Progress;
NewGraphic.LoadFromFile(Filename);
except
NewGraphic.Free;
raise;
end;
FGraphic.Free;
FGraphic := NewGraphic;
FGraphic.OnChange := Changed;
Changed(Self);
end;TGraphicClass= class of TGraphic; --->不明白
---------------------------------------------------------------
在此中:FGraphic := NewGraphic;
即TPicure.Graphic可以使用loadfromfile,不管是什么类型的,应该不出错。
但却出错了。
1、可能是我理解错了,希望能给偶说明一下。(或这里的NewGraphic.LoadFromFile(Filename);为什么会成功?)
2、解释一下Class of。
GraphicClass: TGraphicClass;
...
NewGraphic := GraphicClass.Create;
也就等于 NewGraphic := TGraphic.Create;这个怎么说,在设计模式中,有的时候,我们开始并不知道我们所要构造的具体对象,那么就需要一个变量来表示我们腰构造的对象的类名称,以便于程序在用的时候随时把要构造的对象类当作变量赋值。就用到了Class of,我们可以给GraphicClass赋值为任何一个从TGraphicClass继承下来的类名称。
TComponentClass = class of TComponent;procedure TApplication.CreateForm(InstanceClass: TComponentClass; var Reference);通过不同的类,创建不同的窗体实例
多看几处VCL代码,就能体会出来了
它的功能是通过文件名,载入图片到Graphic中(Graphic: TGraphic;)
这个文件可能是bmp、ico、jpg或者其他类型
他们对应的图像类型是TBitmap\TIcon\TJpegImage
根据扩展名创建适合的类型实例才可能正确的载入该文件
1)、在此中:FGraphic := NewGraphic;
即TPicure.Graphic可以使用loadfromfile,不管是什么类型的,应该不出错。
但却出错了。
1、可能是我理解错了,希望能给偶说明一下。(或这里的NewGraphic.LoadFromFile(Filename);为什么会成功?)
答:第一句代码是为TPICTURE动态指定一个GRAPHIC域的对象实例。从这一句可以看出来,TPICTURE的TGRAPHIC是个私有域成员(从定义可知),你直接在外部通过TPicure.Graphic.loadfromfile()来访问么有域的成员方法是非法的。再说,如果TPicure.Graphic域不存在时,你这样访问,会报内存访问错的!
下面代码可以测试:(放一个IMAGE到界面上,直接运行下面的代码)
if assigned(image1.Picture.Graphic) then
image1.Picture.Graphic.LoadFromFile('c:\test.bmp')
else
showmessage('not find TGraphic');image1.Picture.Graphic.LoadFromFile('c:\test.bmp')//--如果只用这一句,会报内存错。2)、解释一下Class of。
答:呵~~,这个好办。关键字“CLASS OF”可以定义类方法,也可以定义类引用类型的数据类型;在这里:TGraphicClass= class of TGraphic;是定义了一种类引用类型的数据类型。其形式为:TRefClass=CLASS OF TBaseClass;引用类型TRefClass其实就是基类型TBaseClass的一个别名!使用类引用类型的好处就是在动态创建不确定类类型的对象实例时,通过引用类型实现类类型数据的匹配.也就是说,引用类型的数据是可以匹配包括:基类型与其祖先类型的所有数据类型。从TPICTURE的TGRAPHIC来看,它可以包括多种格式的图形对象,这就正好利用了类引用类型的动态对象匹配的特点了。从而实现打开不同类型的图像了。嘻~~,我就写这么多了,不当之处,请指正。