如何在Delphi 2010中显示动画gif

如何在Delphi 2010中显示动画gif,delphi,delphi-2010,Delphi,Delphi 2010,在Delphi2010中,我尝试了以下每一种方法,在我的表单上显示动画gif。所有这些都会导致访问冲突。(三种变体中的两种在每次尝试时都被注释掉。)非常感谢 uses ... GIFImg,... Image1: TImage; procedure TForm1.FormCreate(Sender: TObject); begin // A valid animated gif was loaded into Image1 at design time TGIFImage(ima

在Delphi2010中,我尝试了以下每一种方法,在我的表单上显示动画gif。所有这些都会导致访问冲突。(三种变体中的两种在每次尝试时都被注释掉。)非常感谢

uses
  ... GIFImg,...

Image1: TImage;

procedure TForm1.FormCreate(Sender: TObject);
begin
  // A valid animated gif was loaded into Image1 at design time
  TGIFImage(image1).Animate := true;
  TGIFImage(image1.Picture).Animate := true;
  TGIFImage(image1.Picture.Graphic).Animate := true;
end;
我试图按照上面链接的问题中的答案进行操作,但解决方案对我来说并不适用(而且该问题被明确标记为Delphi-7,我不知道是否发生了变化)。重写到“(image1.Picture.Graphic as TGIFImage).Animate:=true;”会导致“…异常类EInvalidCast,并显示消息“Invalid class typecast”。“我不清楚为什么typecast无效,因为我确定在设计时已加载动画gif

编辑以澄清问题,以下是修订后的代码。showmessage告诉我该映像是TdxSmartImage。不知道它为什么这么想。(我曾尝试将图像加载到devExpress控件中,以查看是否可行,但随后我从表单/项目中删除了所有dexExpress元素,并重新生成了gif文件

procedure TForm1.FormCreate(Sender: TObject);
begin
  image1.Picture.LoadFromFile('C:\ChronSource\ChronDialogs\11.0 job menu.gif');
  ShowMessage(image1.Picture.Graphic.ClassName);
  // this says "TdxSmartImage"
  (image1.Picture.Graphic as TGIFImage).Animate := true;
end;

您有一个第三方库,它已取代了TPicture属性编辑器。该编辑器正在创建库自己的gif实现类,但显然它不支持动画图像

如果要恢复默认的设计时行为,必须卸载属性编辑器。对于一次性覆盖,在加载图片后,编辑dfm文件以更改图片的类名,编辑pas文件以更改所需的单元名称也可能有效(我不确定)

在运行时更容易使用所需的类。如果第三方库中负责gif图像的单元已链接,请先注销该单元

TPicture.UnRegisterGraphicClass(TdxSmartImage);
Image1.Picture.LoadFromFile('...');
(Image1.Picture.Graphic as TGIFImage).Animate := True;

如果没有,您应该能够将图像作为TGifImage加载,而不会出现任何问题。

您有一个第三方库,它已取代了TPicture属性编辑器。该编辑器正在创建库自己的gif实现类,但显然它不支持动画图像

如果要恢复默认的设计时行为,必须卸载属性编辑器。对于一次性覆盖,在加载图片后,编辑dfm文件以更改图片的类名,编辑pas文件以更改所需的单元名称也可能有效(我不确定)

在运行时更容易使用所需的类。如果第三方库中负责gif图像的单元已链接,请先注销该单元

TPicture.UnRegisterGraphicClass(TdxSmartImage);
Image1.Picture.LoadFromFile('...');
(Image1.Picture.Graphic as TGIFImage).Animate := True;

如果没有,您应该能够将图像作为TGifImage加载,而不会出现任何问题。

使用上面的各种响应,我能够想出这种有效的方法

procedure TForm1.FormCreate(Sender: TObject);
  var
    aGIF:TGIFImage;
    sFile: string;
begin
  try
    ...
    aGIF := TGIFImage.Create;
    aGIF.LoadFromFile(sfile);
    aGIF.Animate := true;
    image1.Picture.Graphic := aGIF;
  except
  ...

利用上面的各种回答,我能够想出这种行之有效的方法

procedure TForm1.FormCreate(Sender: TObject);
  var
    aGIF:TGIFImage;
    sFile: string;
begin
  try
    ...
    aGIF := TGIFImage.Create;
    aGIF.LoadFromFile(sfile);
    aGIF.Animate := true;
    image1.Picture.Graphic := aGIF;
  except
  ...

只有第三种变体有效,但只有在GIF加载到
TImage
后才有效。如果在第三种变体上获得AV,则需要调试以找出原因。第一种变体无效,因为
TImage
不是
tgiImage
。第二种变体无效,因为
TPicture
不是
>TGIFImage
。这些是无效的强制转换,但您没有使用
as
运算符来执行强制转换,因此编译器不会生成任何代码来检查强制转换是否在运行时成功
显示消息(image1.Picture.Graphic.ClassName)的功能告诉你?这可能意味着我对我正在做的事情了解不够。(对图像做得很少)。它告诉我这是一个TdxSmartImage。不知道为什么它认为这是某种DevXpress(?)图像,因为此项目中没有剩余的devExpress控件,我用Camtasia重新创建了gif,然后切换到在运行时加载。@Rudy:我认为我知道的不够多,无法很好地问这个问题,但我认为这里的注释反映出这里发生了与前一个问题不同的事情。@Eric clear如果您的项目中有另一个库正在覆盖
TPicture
gif
文件扩展名的注册,那么
TdxSmartImage
将优先于
TGIFImage
。因此,请在运行时删除该库,或者创建自己的
TGIFImage
对象,然后
Assign()
it to
image1.Picture
而不是调用
image1.Picture.LoadFromFile()
。只有第三种变体有效,但只有在GIF加载到
TImage
后才有效。如果您在第三种变体上获得AV,则需要调试以找出原因。第一种变体无效,因为
TImage
不是
tgiImage
。第二种变体无效,因为
TPicture
不是a
TGIFImage
。这些是无效的强制转换,但是您没有使用
as
操作符来执行强制转换,因此编译器不会生成任何代码来检查强制转换是否在运行时成功
ShowMessage(image1.Picture.Graphic.ClassName)是什么告诉你?这可能意味着我对我正在做的事情了解不够。(对图像做得很少)。它告诉我这是一个TdxSmartImage。不知道为什么它认为这是某种DevXpress(?)图像,因为此项目中没有剩余的devExpress控件,我用Camtasia重新创建了gif,然后切换到在运行时加载。@Rudy:我认为我知道的不够多,无法很好地问这个问题,但我认为这里的注释反映出这里发生了与前一个问题不同的事情。@Eric clear如果您的项目中有另一个库正在覆盖
TPicture
gif
文件扩展名的注册,那么
TdxSmartImage
将优先于
TGIFImage
。因此,请在运行时删除该库,或者创建自己的
TGIFImage
对象,然后
Assign()
it to
image1.Picture
而不是调用