如何在 Delphi 2010 中显示动画 gif

how to display an animated gif in Delphi 2010

我在 Delphi 2010 年尝试了以下各项以在我的表单上显示动画 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;”导致“...异常 class EInvalidCast 消息 'Invalid class typecast'。”我不清楚为什么类型转换无效,因为我确信在设计时已经加载了动画 gif。

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

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

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

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

在运行时使用您想要的 class 更容易。如果链接了第三方库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
  ...