已发布的大枚举集属性的问题

时间:2014-03-02 20:34:34

标签: delphi properties enums

我正在为IDE创建一个包含许多已发布属性的组件,其中一个属性是包含38个值的枚举集...

type
  TBigEnum = (beOne, beTwo, beThree, beFour, beFive, beSix, beSeven, beEight,
    beNine, beTen, beEleven, beTwelve, beThirteen, beFourteen, beFifteen,
    beSixteen, beSeventeen, beEighteen, beNineteen, beTwenty, beTwentyOne,
    beTwentyTwo, beTwentyThree, beTwentyFour, beTwentyFive, beTwentySix,
    beTwentySeven, beTwentyEight, beTwentyNine, beThirty, beThirtyOne,
    beThirtyTwo, beThirtyThree, beThirtyFour, beThirtyFive, beThirtySix,
    beThirtySeven, beThirtyEight);
  TBigEnums = set of TBigEnum;

现在,我尝试在组件中将其用作已发布的属性...

type
  TMyComponent = class(TComponent)
  private
    FBigEnums: TBigEnums;
  published
    property BigEnums: TBigEnums read FBigEnums write FBigEnums;
  end;

但编译器不允许我......

[DCC Error] MyUnit.pas(50): E2187 Size of published set 'BigEnums' is >4 bytes

我理解这个限制,但是如何在不将它分成两组的情况下解决这个问题呢?

PS - 这些值中的每一个实际上都有一个唯一的名称和目的,但为了示例,我只使用了这个数字作为名称。

1 个答案:

答案 0 :(得分:2)

我不记得确切正确的语法,但原则上是:

1 如果"属性"不必在属性检查器中轻松编辑,然后定义38种类型为Long的 consts ,其值设置为1 shl 0, 1 shl 1, 1 shl 2..

这样可以像PropOne or PropTwo or PropThree

那样组合这些结果

2 如果属性必须在属性检查器中可编辑,那么Jerry的答案中提出的TMyPersistent类对我来说似乎没问题

3 可能有一种内置于语言(或编译器指令)中的方法,如何对集合表示进行类型转换,以便它使用8个字节进行存储。 Int32和Int64都是在新处理器上得到很好支持的本机数据类型,汇编程序,C ++和C#都可以处理它。 一些Pascal风味(Free Pascal?)要么实现了,要么已经在路线图中

编辑选项 3 似乎具有误导性。 Free Pascal编译器对枚举的作用在http://www.freepascal.org/docs-html/prog/prog.html列出,特别是在章节$PACKENUM中。截至今天,枚举总是由32位ordinals支持。因此可以增加用于" enums"可能在汇编程序,C ++,C#中不太可能在Delphi中可用。

我甚至不确定在其他语言中用于实现枚举和集合的按位运算符and, or, not, shl, shr是否可用于Delphi或Free Pascal中的8字节整数,因此选项 1 < / strong>也可能会产生误导,获胜者可以选择 2