【发布时间】: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