delphi - 创建一个包含每个成员的集合

标签 delphi

有没有办法在编译时(或运行时以恒定时间)创建一个包含序数类型 T 成员的集合,其中包含 的每个命名值>T

换句话说,我如何补充特定类型的空集?

type 
  TEnum = 
  ( 
    eA = 1,
    eB = 5,
    eC = 34 
  );
  TSet = set of TEnum;

const
  CSet: TSet = ~[]; // with ~ being my fictional set complement operator

那么CSet应该只包含命名eAeBeC.

当然这不是一个实际问题,我只是好奇

<小时/>

编辑

我没有意识到使用显式的非连续值声明时枚举类型的行为。该枚举仍然包含未命名的成员来填补空白。更新了问题以仅适用于指定成员

最佳答案

对于没有指定值的枚举来说非常容易,例如

type 
  TEnum = 
  ( 
    eA,
    eB,
    eC 
  );
  TSet = set of TEnum;

const
  CSet: TSet = [eA..eC];
  CSet: TSet = [low(TEnum)..high(TEnum)];
<小时/>

但是,您的 TEnum 定义为

type 
  TEnum = 
  ( 
    eA = 1,
    eB = 5,
    eC = 34 
  );

上面的方法不会按您期望的方式工作。在您的情况下,CSet 将包含低枚举值和高枚举值(1 到 34)之间的所有数值。

仅获取已明确命名的 TEnum 值的唯一方法是使用 CSet: TSet = [eA, eB, eC];

这是设计使然,如 Simple Types 中所述。

关于delphi - 创建一个包含每个成员的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33680589/

相关文章:

delphi - 使对话框与 "large fonts"兼容。

delphi - Firemonkey半透明Image3D有时不透明

delphi - 如何追踪访问冲突 "at address 00000000"

windows - Delphi 中的 GDI 行间距?

delphi - 如何从GIF动画中获取帧延迟?

database - 带有 MS Access 2010 数据库的 Delphi FireDAC。为什么它将 ACE 转换为 Jet?

delphi - 如何使用 Indy 发送 DELETE 请求?

delphi - 如何正确地将属性注入(inject)到表单中?

windows - 是什么导致桌面盾牌图标覆盖在 *SOME* 桌面上

delphi - 如何从图像中获取摘要信息?