从集合初始化无类型常量

时间:2013-06-24 13:02:31

标签: delphi initialization set delphi-xe2

我正在将一个集类型和一个数字编码到一个(32位)Tag属性中。从标签中检索集合非常简单:TDaySet(Byte((tag and $ff000000) shr 24))。但是,如何设置包含此编码集信息的常量?

const
  FRED_SCHEDULE = ID_FRED or (Byte([Monday, Wednesday]) shl 24);

这不编译。实际错误是“无效的类型转换”但我认为根本问题是我正在尝试从类型化常量初始化非类型常量。

有没有人有更好的主意?

1 个答案:

答案 0 :(得分:3)

嗯,首先[Monday, Wednesday]不是类型常量。它不是类型化常量,因为您没有声明类型。输入的常量是

const
  Days: TSetOfDays = [Monday, Wednesday];

但是,如你所知,你不能从类型常量中得到一个真正的常数。并且您不能指望编译器知道如何解释表达式中的[Monday, Wednesday],因为您没有声明类型。

因此,您不能使用set notation声明一个真常量,因为如果指定集合的​​类型,则只能使用set notation。这意味着你试图做的事情可能不太现实。我的意思是,你可以这样写:

const
  FRED_SCHEDULE = ID_FRED 
    or ((1 shl ord(Monday) or 1 shl ord(Wednesday)) shl 24);

但这样做会很疯狂。