加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 记录中的多个变体部分

发布时间:2020-12-15 09:52:29 所属栏目:大数据 来源:网络整理
导读:我正在编写一个小工具,使用Delphi XE2对SWF文件进行一些操作.到目前为止,我只是关注 the SWF specification,现在我在实现数据结构来表示形状方面遇到了一个小问题. SWF形状包含许多形状记录.形状记录可以是边缘记录或非边缘记录,并且这两种类型中的每一种都
我正在编写一个小工具,使用Delphi XE2对SWF文件进行一些操作.到目前为止,我只是关注 the SWF specification,现在我在实现数据结构来表示形状方面遇到了一个小问题.

SWF形状包含许多形状记录.形状记录可以是边缘记录或非边缘记录,并且这两种类型中的每一种都具有两个附加子类型.

具体地,在说明书的第135页,描述了两种非边缘记录类型; EndShapeRecord和StyleChangeRecord.在SWF文件中,区分它们的方法是检查所有五个标志位(在TypeFlag之后)是否为0;如果是,则为EndShapeRecord,否则为StyleChangeRecord.

为了帮助我稍后处理形状记录,我想使用变量记录将边缘和非边缘记录统一到单个记录类型中.区分不同类型的记录很容易;嵌套的变体记录允许我轻松地将边缘记录分开,对于非边缘记录,我可以从StyleChangeRecord声明5个标志并编写函数IsEndRecord.

但是,为了使我的源代码尽可能地反映规范,我想更进一步. StyleChangeRecord中其他字段的存在取决于这5个标志的值,因此我希望能够声明5个变体记录,每个标志一个,其中包含每个标志添加的字段. (我意识到这不会以任何方式影响内存使用,但这不是重点.)

遗憾的是,Delphi似乎不允许每个“级别”允许多个变体部分,并且尝试在同一级别定义这5个变体部分只会引发大量语法错误.

TShapeRecord = record
  case EdgeRecord: Boolean of
    False: (
      case StateMoveTo: Boolean of
        True: (
          MoveBits: Byte;
          MoveDeltaX: Int32;
          MoveDeltaY: Int32;
        );
      case StateLineStyle: Boolean of // << Errors start here
        True: (LineStyle: UInt16);
      //Additional flags
    );
    //Fields for edge records
end;

用稍微简单的术语来说,目标是能够像这样制定一条记录:

TNonEdgeRecord = record
    case StateMoveTo: Boolean of
      True: (
        MoveBits: Byte;
        MoveDeltaX: Int32;
        MoveDeltaY: Int32;
      );
    case StateLineStyle: Boolean of
      True: (LineStyle: UInt16);
end;

…没有删除记录的变体部分,也没有嵌套它们(因为嵌套意味着从语法的角度来看不正确的关系).

是否有其他方法可以在记录中声明多个(非嵌套)变体部分,或者我应该回到不使用内部部分的变体记录?

解决方法

不会.Pascal的Borland分支只允许在记录结尾处使用变体部分.

嵌套是唯一的方法.

有关一些有趣的例子和观察,请参阅Rudy Velthuis撰写的这篇文章:

http://rvelthuis.de/articles/articles-convert.html(搜索“联盟”部分)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读