动画 GIF 图像抛出异常
Animating GIF image throws exception
我试图在 XE7 中为 GIF 图像设置动画,但是当我将 Animate 属性 设置为 True 时出现异常。
这是.pas
unit Unit6;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,
GifImg, Vcl.ExtCtrls;
type
TForm6 = class(TForm)
Spinner: TImage;
Button1: TButton;
procedure Button1Click(Sender: TObject);
end;
var
Form6: TForm6;
implementation
{$R *.dfm}
procedure TForm6.Button1Click(Sender: TObject);
begin
TGifImage(Spinner.Picture.Graphic).Animate := True;
end;
end.
和.dfm
object Form6: TForm6
Left = 0
Top = 0
BorderStyle = bsDialog
Caption = 'GIF Test'
ClientHeight = 83
ClientWidth = 115
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
Position = poScreenCenter
PixelsPerInch = 96
TextHeight = 13
object Spinner: TImage
Left = 45
Top = 13
Width = 24
Height = 24
AutoSize = True
IncrementalDisplay = True
ParentShowHint = False
Picture.Data = {
0D546478536D617274496D61676547494638396118001800840000FFFFFF0000
00CECECEFAFAFAE0E0E0B0B0B0E8E8E88E8E8EC8C8C89C9C9CD8D8D8A8A8A8C0
C0C0F2F2F2767676868686B8B8B8686868000000000000000000000000000000
00000000000000000000000000000000000000000000000000000021FE1A4372
6561746564207769746820616A61786C6F61642E696E666F0021FF0B4E455453
43415045322E30030100000021F90401070000002C00000000180018000008B3
0001081C48100004080513262440F0C10385100110708050608408031B308C28
F081838D170712D8C8118283041D1F02D0D8002249001E5B1E1438D2A5430103
17B4244852E34B010E51725C397267C6050F16701CF932A1D1A150A30A14B020
4182053887FA24D0A081000856B142EDCAF4A9D4B368053680203622D3850B16
4030BBB0E8D10524053CD598B1A6DAA75F5BFAE54A902E4D085907131E7A70A7
80AC129B3A159017324BAD041FA72DD8756840003B}
ShowHint = True
Transparent = True
end
object Button1: TButton
Left = 13
Top = 49
Width = 91
Height = 25
Caption = 'Button1'
TabOrder = 0
OnClick = Button1Click
end
end
我安装了 DevExpress 控件,属性编辑器中的图片 属性 声明为 TcxSmartImage
。然而,这个 class 是从 TGraphic 派生出来的,所以我不明白这怎么会导致异常。
TGifImage(Spinner.Picture.Graphic).Animate := True;
可能的解释是 Spinner.Picture.Graphic
不是 TGifImage
类型。我怀疑如果您使用运行时检查的转换,那么您会发现情况就是这样。
(Spinner.Picture.Graphic as TGifImage).Animate := True;
如果您对显示的 Picture.Data
上下文中包含的十六进制进行解码,您会发现此 ASCII 文本:
TdxSmartImage
这表明您的图像控件不包含 TGifImage
。
作为一般规则,您应该这样做。避免使用未经检查的强制转换。如果您犯了错误并转换为无效类型,那么未经检查的转换结果将无法预测。最好的情况是您遇到运行时错误并且至少意识到存在问题。但是,运行时错误总是有些神秘。错误的未经检查的转换的最坏情况是没有运行时错误并且代码似乎可以工作。
另一方面,与运行时检查转换一起使用的无效类型将导致信息错误消息。
感谢@SpeedFreak 对这个 DevExpress 支持项目的有用评论:https://www.devexpress.com/Support/Center/Question/Details/Q562011
DevExpress 组件似乎为 GIF 扩展注册了自己的处理程序。而且该处理程序不支持动画。
所以我想解决这个问题的最简单方法是在运行时从资源加载 GIF 图像,这样可以避免依赖所有将图像扩展与图形组件相关联的设计时魔法。
我试图在 XE7 中为 GIF 图像设置动画,但是当我将 Animate 属性 设置为 True 时出现异常。
这是.pas
unit Unit6;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,
GifImg, Vcl.ExtCtrls;
type
TForm6 = class(TForm)
Spinner: TImage;
Button1: TButton;
procedure Button1Click(Sender: TObject);
end;
var
Form6: TForm6;
implementation
{$R *.dfm}
procedure TForm6.Button1Click(Sender: TObject);
begin
TGifImage(Spinner.Picture.Graphic).Animate := True;
end;
end.
和.dfm
object Form6: TForm6
Left = 0
Top = 0
BorderStyle = bsDialog
Caption = 'GIF Test'
ClientHeight = 83
ClientWidth = 115
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
Position = poScreenCenter
PixelsPerInch = 96
TextHeight = 13
object Spinner: TImage
Left = 45
Top = 13
Width = 24
Height = 24
AutoSize = True
IncrementalDisplay = True
ParentShowHint = False
Picture.Data = {
0D546478536D617274496D61676547494638396118001800840000FFFFFF0000
00CECECEFAFAFAE0E0E0B0B0B0E8E8E88E8E8EC8C8C89C9C9CD8D8D8A8A8A8C0
C0C0F2F2F2767676868686B8B8B8686868000000000000000000000000000000
00000000000000000000000000000000000000000000000000000021FE1A4372
6561746564207769746820616A61786C6F61642E696E666F0021FF0B4E455453
43415045322E30030100000021F90401070000002C00000000180018000008B3
0001081C48100004080513262440F0C10385100110708050608408031B308C28
F081838D170712D8C8118283041D1F02D0D8002249001E5B1E1438D2A5430103
17B4244852E34B010E51725C397267C6050F16701CF932A1D1A150A30A14B020
4182053887FA24D0A081000856B142EDCAF4A9D4B368053680203622D3850B16
4030BBB0E8D10524053CD598B1A6DAA75F5BFAE54A902E4D085907131E7A70A7
80AC129B3A159017324BAD041FA72DD8756840003B}
ShowHint = True
Transparent = True
end
object Button1: TButton
Left = 13
Top = 49
Width = 91
Height = 25
Caption = 'Button1'
TabOrder = 0
OnClick = Button1Click
end
end
我安装了 DevExpress 控件,属性编辑器中的图片 属性 声明为 TcxSmartImage
。然而,这个 class 是从 TGraphic 派生出来的,所以我不明白这怎么会导致异常。
TGifImage(Spinner.Picture.Graphic).Animate := True;
可能的解释是 Spinner.Picture.Graphic
不是 TGifImage
类型。我怀疑如果您使用运行时检查的转换,那么您会发现情况就是这样。
(Spinner.Picture.Graphic as TGifImage).Animate := True;
如果您对显示的 Picture.Data
上下文中包含的十六进制进行解码,您会发现此 ASCII 文本:
TdxSmartImage
这表明您的图像控件不包含 TGifImage
。
作为一般规则,您应该这样做。避免使用未经检查的强制转换。如果您犯了错误并转换为无效类型,那么未经检查的转换结果将无法预测。最好的情况是您遇到运行时错误并且至少意识到存在问题。但是,运行时错误总是有些神秘。错误的未经检查的转换的最坏情况是没有运行时错误并且代码似乎可以工作。
另一方面,与运行时检查转换一起使用的无效类型将导致信息错误消息。
感谢@SpeedFreak 对这个 DevExpress 支持项目的有用评论:https://www.devexpress.com/Support/Center/Question/Details/Q562011
DevExpress 组件似乎为 GIF 扩展注册了自己的处理程序。而且该处理程序不支持动画。
所以我想解决这个问题的最简单方法是在运行时从资源加载 GIF 图像,这样可以避免依赖所有将图像扩展与图形组件相关联的设计时魔法。