delphi - 动画 GIF 图像抛出异常

标签 delphi animated-gif delphi-xe7

我尝试在 XE7 中对 GIF 图像进行动画处理,但是当我将 Animate 属性设置为 True 时,会引发异常。

enter image description here

这是 .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 控件,并且属性编辑器中的 Picture 属性被声明为 TcxSmartImage。然而,这个类是从 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 图像,这样可以避免依赖将图像扩展与图形组件相关联的所有设计时魔法。

关于delphi - 动画 GIF 图像抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28148858/

相关文章:

C# 将 delphi TColor 转换为颜色(十六进制)

delphi - 防止双击 TButton

python - Tkinter:在没有 PIL 的情况下在 Canvas 上移动 Gif

pdf - 是否可以在 PDF 中嵌入动画 GIF?

delphi - 当其中的单元使用 DesignEditors DesignIntf​​ 时,如何为 WIN64 构建 delphi 项目?

delphi - 编译器完成编译后出现警告 "Symbol TMemoryManager is deprecated"

sql - Sql 表达式中的列名不明确

android - 如何使用 FireMonkey 在 iOS 上的默认应用程序中打开文件

jQuery 显示每个缩略图的加载 div 直到加载

delphi - 在 XE7 的 VCL 应用程序中使用 FMX 表单?