【问题标题】:how to display an animated gif in Delphi 2010如何在 Delphi 2010 中显示动画 gif
【发布时间】:2018-04-03 21:35:14
【问题描述】:

我已在 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;”导致“...异常类 EInvalidCast 带有消息‘无效类类型转换’。”我不清楚为什么类型转换无效,因为我确信动画 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;

【问题讨论】:

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

标签: delphi delphi-2010


【解决方案1】:

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

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

在运行时使用你想要的类更容易。如果第三方库中负责 gif 图像的单元已链接,请先取消注册。

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

如果没有,您应该可以毫无问题地将图像加载为 TGifImage。

【讨论】:

  • 非常感谢。您的各种 cmet 帮助我找出了以下最终可行的解决方案。
  • @Eric - 不客气。我想知道您是否尝试过答案中的解决方案。我很好奇它是否对你有用。
  • 我没有按原样尝试它,因为我在这个测试应用程序中编写的部分将进入一个更大的库。我对 UnRegisterGraphicClass 持怀疑态度,因为我不确定这会如何影响库中的其他 devExpress 控件。您让我意识到需要将加载的图像显式转换为 gif,但我在下面采用的方法让我觉得对其他控件的风险较小。
  • 很公平,感谢您的解释。接受自己的答案并没有错,这是一个很好的解决方案。
【解决方案2】:

使用上面的各种回复,我想出了这种可行的方法;

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
  ...

【讨论】:

  • 您应该将aGIF 对象包装在try..finally 块中,因为无论是否引发异常,您都需要Free 它。 Graphic 属性设置器将创建自己的TGIFImage 对象,该对象具有aGIF 数据的副本,因此您必须在之后调用aGIF.Free 以避免内存泄漏。跨度>
猜你喜欢
  • 1970-01-01
  • 2019-01-04
  • 2016-06-06
  • 1970-01-01
  • 2011-02-25
  • 2012-09-15
  • 2013-03-14
相关资源
最近更新 更多