最近在用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。

解决方案 »

  1.   

    TGraphicClass= class of TGraphic; private 
      GraphicClass: TGraphicClass;
    ...
    NewGraphic := GraphicClass.Create;
    也就等于 NewGraphic := TGraphic.Create;这个怎么说,在设计模式中,有的时候,我们开始并不知道我们所要构造的具体对象,那么就需要一个变量来表示我们腰构造的对象的类名称,以便于程序在用的时候随时把要构造的对象类当作变量赋值。就用到了Class of,我们可以给GraphicClass赋值为任何一个从TGraphicClass继承下来的类名称。
      

  2.   

    在工程里的一句:Application.CreateForm(TForm1, Form1);type
      TComponentClass = class of TComponent;procedure TApplication.CreateForm(InstanceClass: TComponentClass; var Reference);通过不同的类,创建不同的窗体实例
    多看几处VCL代码,就能体会出来了
      

  3.   

    procedure TPicture.LoadFromFile(const Filename: string);
    它的功能是通过文件名,载入图片到Graphic中(Graphic: TGraphic;)
    这个文件可能是bmp、ico、jpg或者其他类型
    他们对应的图像类型是TBitmap\TIcon\TJpegImage
    根据扩展名创建适合的类型实例才可能正确的载入该文件
      

  4.   

    我哭啊,刚编辑完,网就断了,重来一次!-_-!!
    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来看,它可以包括多种格式的图形对象,这就正好利用了类引用类型的动态对象匹配的特点了。从而实现打开不同类型的图像了。嘻~~,我就写这么多了,不当之处,请指正。
      

  5.   

    谢谢dinglinger(红辣椒)的解答哈。