如何在 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
...
我在 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
...