关于class of....(100分)

  • 主题发起人 主题发起人 javesun
  • 开始时间 开始时间
J

javesun

Unregistered / Unconfirmed
GUEST, unregistred user!
最近在用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。

偶一菜菜,分不多,只好给100分了。
 
GraphicClass := FileFormats.FindExt(Ext);
FileFormats.FindExt这是个工厂类,他根据文件的后缀名决定返回一个具体的能载入这个文件的类

NewGraphic := GraphicClass.Create;这个时候才决定用哪个类生成具体的对象

这是个工厂模式和多态的很好的例子
 
后来双仔细看了一下;GraphicClass := FileFormats.FindExt(Ext);
如楼上所说的,还不是很清楚工厂类的或着说是class of的运作方式。。。能否解释解释?
 
后退
顶部